有一个小问题,我需要第二双眼睛,因为我正处于代码被黑客攻击的地步,而不是花时间来分解它。
该程序的最终目标是根据用户选择读入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();
}
}
答案 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
。