从多个文件内容创建文件
本文关键字:文件 创建 | 更新日期: 2023-09-27 18:33:07
我正在尝试使用由多个文件中的行中的数据创建的名称创建新文件。
我想读取文件夹中.txt文件的所有行,然后从该列表创建文件。
这些文件具有不同数量的行数,并且可能有不同数量的.txt文件。
这是我尝试过的代码;
static void WriteToFile(string directory, string name)
{
string filename = String.Format(name);
string path = Path.Combine(directory, filename);
using (StreamWriter sw = File.CreateText(path))
{
sw.WriteLine("Inserted Text");
}
}
......
string[] allFiles = Directory.GetFiles(folder, "*.txt");
foreach (string file in allFiles)
{
string[] lines = File.ReadAllLines(file);
foreach (string newfile in lines)
{
WriteToFile(folder, newfile);
}
}
现在正在创建文件,但我需要指定扩展名,因为它们只是创建为"file1"而不是"file1.ext"
File.Create Method (String) 返回FileStream
.必须释放FileStream
以刷新文件。尝试使用此代码创建一个空文件:
File.Create(fileName).Dispose();
另外,看看类似的问题:在 C# 中创建空文件。
没有任何错误/异常的细节,对我来说,这似乎是权限问题或字符问题。您可以将Path.GetInvalidPathChars
与Enumerable.Intersect
一起使用,以在创建新文件之前检查文件路径是否包含无效字符
char[] invalidPathChars = Path.GetInvalidPathChars();
foreach (string newfile in lines)
{
if (invalidPathChars.Intersect(newfile).Any())
{
Console.WriteLine(newfile + " contains invalid characters for file name");
continue;
}
File.Create(newfile);
}
File.Create
返回可用于写入新文件的filestream
。但是你提供的路径不是Create
的参数,而是行。该行可能是无效路径。
您可以改用此查询:
string invalidCharacters = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
var allPaths = Directory.EnumerateFiles(folder, "*.txt")
.SelectMany(path => File.ReadLines(path))
.Select(line => {
string fileName = line;
foreach (Char c in invalidCharacters)
fileName = fileName.Replace(c.ToString(), "_");
return new{ line, path = Path.Combine(targetFolder, fileName) };
} );
foreach(var p in allPaths)
{
File.WriteAllText(p.path, p.line);
}
编辑:但是,这很可能导致此错误:
指定的路径和/或文件名太长。该 完全 限定文件名必须少于 260 个字符,并且 目录名称必须少于 248 个字符。
因此,您需要使用缩短路径的方法(例如,使用附加数字的逻辑以避免重复名称)。
static void WriteToFile(string directory, string name)
{
string filename = String.Format(name + ".ini");
string path = Path.Combine(directory, filename);
using (StreamWriter sw = File.CreateText(path))
{
sw.WriteLine("Inserted Text");
}
}
......
var allFiles = Directory.GetFiles(folder, "*.txt");
foreach (string file in allFiles)
{
var lines = File.ReadAllLines(file);
foreach (string newfile in lines)
{
WriteToFile(folder, newfile);
}
}