【问题标题】:C# Reading Multiple Files and Writing Out OneC#读取多个文件并写出一个
【发布时间】:2015-05-16 04:27:51
【问题描述】:

有一个小问题,我需要第二双眼睛,因为我正处于代码被破解的地步,而不是花时间分解它。

程序的最终目标是根据用户的选择读取X个文件,将这些文件一起放入内存,然后将它们全部附加到一个Word文件中。

它只是写出第一个文件。如果我更改为 WriteFile 方法,它只会写出最后一个文件。我希望它写出所有文件

任何正确方向的提示将不胜感激。

private void cmdSubmit_Click(object sender, EventArgs e)
{
    SaveFileDialog saveFile = new SaveFileDialog();
    saveFile.Filter = "Word Files (*.doc)|*.doc";
    saveFile.FilterIndex = 1;
    saveFile.RestoreDirectory = true;

    string dirPath = "";
    FileStream destStream = (dynamic)null;
    MemoryStream outStream = new MemoryStream();

    if (saveFile.ShowDialog() == DialogResult.OK)
    {
        dirPath = saveFile.FileName;
        destStream = new FileStream(dirPath, FileMode.Create, FileAccess.Write);
        destStream.Close();
    }

    DirectoryInfo di = new DirectoryInfo(@"FilePath");
    FileInfo[] args = di.GetFiles("*.doc");

    foreach (object itemChecked in chkLB.CheckedItems)
    {

        //loop through checked items and add to file

        string fileStream = di.ToString() + itemChecked.ToString() + ".doc";//READ IN FILES

        FileStream inFile = File.OpenRead(fileStream); //Read the files one by one
        outStream.SetLength(inFile.Length);
        inFile.Read(outStream.GetBuffer(), 0, (int)inFile.Length);

        outStream.Flush();
        inFile.Close();

        fileSave(outStream, dirPath);

        //MessageBox.Show("Item with title: \"" + itemChecked.ToString()); Nice trick to add "" around a value

    }

    //Open File
    //Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
    //Document openDoc = word.Documents.Open(dirPath);
    MessageBox.Show("DONE");

}

public static void fileSave(MemoryStream memStream, string saveFile)
{

    //FileStream fileOut = File.Open(saveFile, FileMode.Append);

    if (!File.Exists(saveFile))
    {


        FileStream fileOut = new FileStream(saveFile, FileMode.OpenOrCreate, FileAccess.Write);
        //stream writter?
        memStream.WriteTo(fileOut);
        fileOut.Flush();
        fileOut.Close();
    }
    else
    {
        FileStream fileOut = new FileStream(saveFile, FileMode.Append, FileAccess.Write);

        memStream.WriteTo(fileOut);

        fileOut.Flush();
        fileOut.Close();
    }
}

【问题讨论】:

  • 你能详细说明问题吗?
  • 有什么问题?如果您能告诉我们什么工作不正常,我们中的任何一个人都会很乐意帮助您。
  • 对不起,是的,它只是写出第一个文件。如果我更改为 WriteFile 方法,它只会写出最后一个文件。我希望它写出所有文件。
  • 您确实意识到,如果您让您的代码按照您所说的方式工作,结果将不会是一个可以在 Word 中实际打开的 Word 文档。
  • 如果使用 interop 这个词更容易完成它,那很好,我试图限制一个简单任务的资源。

标签: c# io


【解决方案1】:

使用 open XMl 将两个 word 文件合并为一个。 AltChunk 是您问题的答案。 http://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.altchunk.aspx

【讨论】:

  • 我来看看。 AltChunk 在为项目做预先规划时出现在我的雷达上,但并没有深入研究。
  • np,请随时回复这里将帮助您的代码:)
【解决方案2】:

这个问题有两个答案。

回答 1。 如果您所做的只是读取文件并将它们合并到一个新文件中,那么您可能不需要编写代码。你可以使用命令:

C:\> copy x.doc+y.doc+z.doc output.doc

现在可以在需要时通过 Process.Start 调用它。

答案 2:

string[] files = { @"E:\x.txt", @"E:\y.txt", @"E:\z.txt" };

FileStream outputFile = new FileStream(@"E:\output.txt", FileMode.Create);

using (BinaryWriter ws = new BinaryWriter(outputFile))
{
    foreach (string file in files)
    {
        ws.Write(System.IO.File.ReadAllBytes(file));
    }
}

【讨论】:

  • .NET 接受 / 作为有效的文件分隔符。您可以使用它来避免需要@ 或转义。很好的答案,不过
  • 我喜欢简洁,但由于多种原因需要用户输入,因此需要代码。
  • @Bill : 我希望你能自己做那部分。
  • 是的,这很容易:)
  • 然后将其作为答案。这对其他人会有所帮助。
【解决方案3】:

嗯...简单的方法不会比这更困难:

public static void Concatenate( IEnumerable<FileInfo> files , FileInfo destination , bool overWriteDestination = true )
{
  FileMode mode = overWriteDestination ? FileMode.Create : FileMode.Append ;

  using ( FileStream tgt = destination.Open( mode , FileAccess.Write , FileShare.Read ) )
  {
    foreach( FileInfo file in files )
    {
      using ( FileStream src = file.Open( FileMode.Open , FileAccess.Read , FileShare.Read ) )
      {
        const int bufferSize = 64*1024; // 64k buffer OK?
        src.CopyTo( tgt , bufferSize ) ;
      }
    }
    tgt.Flush() ;
  }

  return;
}

...

DirectoryInfo dir = new DirectoryInfo( @"C:\foo") ;
FileInfo target = new FileInfo( @"C:\foo.glob") ;
Concatenate( dir.EnumerateFiles( "*.*" ) , target , true ) ;

这将满足您的要求(连接文件)。但归根结底,您所拥有的只是连接在一起的所有不同的八位位组。如果您希望生成一个 MS Word 文档,那就是每个页面的功能连接文件,这不会发生。

很容易。

这是一个相当复杂的过程。这些可能有用:

所有这些技术都假设您正在使用*.docx 文件(它们是XML)而不是二进制*.doc 文件。如果你必须处理*.doc 文件,Good luck。您最好将它们转换为 RTF 并对其进行解析,或者将它们转换为 *.docx

【讨论】:

    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多