1

我正在尝试使用由多个文件中的行中的数据创建的名称创建新文件。

我想读取文件夹中 .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”

4

4 回答 4

1

File.Create 方法(字符串)返回FileStream. FileStream 必须处理以刷新文件。尝试使用此代码创建一个空文件:

File.Create(fileName).Dispose();

另外,看看类似的问题:Creating an empty file in C#

于 2013-09-29T00:03:59.307 回答
0

如果没有任何错误/异常的详细信息,对我来说似乎是权限问题或字符问题。您可以使用Path.GetInvalidPathCharswithEnumerable.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);
    }
于 2013-09-29T00:01:23.340 回答
0

File.Create返回filestream可用于写入新文件的 a。但是您没有提供作为参数的路径,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 个字符。

因此,您需要使用一种缩短路径的方法(fe 使用附加数字以避免重复名称的逻辑)。

于 2013-09-29T00:02:49.260 回答
0
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);
    }
}
于 2013-09-29T12:08:10.253 回答