我只想合并给定目录中的所有文本文件,类似于以下命令提示符命令:
cd $directory
copy * result.txt
我写了下面的代码,几乎完成了我想要的东西,但是它做了一些奇怪的事情。当StreamWriter
写入第一个文件(或i = 0
)时,它实际上并不写任何内容 - 文件大小保持为0字节,尽管第一个文件大约为300 KB。但是,其他文件写入成功执行。
如果我将命令提示符的输出与diff中C#代码的输出进行比较,则可以看到缺少大块文本。此外,命令提示符结果为1,044 KB,其中C#结果为700 KB。
string[] txtFiles = Directory.GetFiles(filepath);
using (StreamWriter writer = new StreamWriter(filepath + "result.txt"))
{
for (int i = 0; i < txtFiles.Length; i++)
{
using (StreamReader reader = File.OpenText(txtFiles[i]))
{
writer.Write(reader.ReadToEnd());
}
}
}
我是否错误地使用了StreamWriter
/ StreamReader
?
答案 0 :(得分:1)
在这里,希望它可以帮到你。注意:通过从流复制到另一个流,您可以节省一些内存并大大提高性能。
class Program
{
static void Main(string[] args)
{
string filePath = @"C:\Users\FunkyName\Desktop";
string[] txtFiles = Directory.GetFiles(filePath, "*.txt");
using (Stream stream = File.Open(Path.Combine(filePath, "result.txt"), FileMode.OpenOrCreate))
{
for (int i = 0; i < txtFiles.Length; i++)
{
string fileName = txtFiles[i];
try
{
using (Stream fileStream = File.Open(fileName, FileMode.Open, FileAccess.Read))
{
fileStream.CopyTo(stream);
}
}
catch (IOException e)
{
// Handle file open exception
}
}
}
}
}
答案 1 :(得分:1)
简单实现,读取字节并写入它们而不是使用流进行读取 - 请注意,您应该正确处理IOException以避免错误行为:
var newline = Encoding.ASCII.GetBytes(Environment.NewLine);
var files = Directory.GetFiles(filepath);
try
{
using (var writer = File.Open(Path.Combine(filepath, "result.txt"), FileMode.Create))
foreach (var text in files.Select(File.ReadAllBytes))
{
writer.Write(text, 0, text.Length);
writer.Write(newline, 0, newline.Length);
}
}
catch (IOException)
{
// File might be used by different process or you have insufficient permissions
}
答案 2 :(得分:0)
我写了你的代码,它运作正常!只更改一行:
using (StreamWriter writer = new StreamWriter(filepath + "result.txt"))
为:
using (StreamWriter writer = new StreamWriter(filepath + "/result.txt"))
我猜您无法看到该文件,因为它已保存在另一个文件夹中。