【问题标题】:Create files from multiple files contents从多个文件内容创建文件
【发布时间】:2013-09-28 23:51:04
【问题描述】:

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

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

【问题讨论】:

  • 不确定,c# 新手,所以不确定如何正确捕获异常。无论如何,它不会继续脚本的其余部分。
  • 你试过使用调试器吗?
  • 好的,所以我已经得到了上面的代码,但是我需要能够指定它为它创建的文件提供的扩展名。

标签: c# file


【解决方案1】:

File.Create Method (String) 返回FileStreamFileStream 必须处理以刷新文件。尝试使用此代码创建一个空文件:

File.Create(fileName).Dispose();

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

【讨论】:

    【解决方案2】:

    没有任何错误/异常的详细信息,对我来说似乎是权限问题或字符问题。 您可以使用Path.GetInvalidPathCharsEnumerable.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);
        }
    

    【讨论】:

      【解决方案3】:

      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 个字符。

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

      【讨论】:

        【解决方案4】:
        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);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2020-08-23
          • 2011-05-07
          • 2018-10-12
          • 2021-09-21
          • 2016-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多