C#读取多个文件并写出一个

时间:2015-05-15 19:45:22

标签: c# io

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

该程序的最终目标是根据用户选择读入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();
    }
}

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这个问题有两个答案。

回答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));
    }
}

答案 2 :(得分:0)

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

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