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.ext」ではなく「file1」として作成されるため、拡張子を指定する必要があります

4

4 に答える 4

1

File.Create メソッド (文字列)は を返しますFileStreamFileStream file をフラッシュするには、 を破棄する必要があります。次のコードを使用して、空のファイルを作成してみてください。

File.Create(fileName).Dispose();

また、同様の質問を見てください: C# で空のファイルを作成します

于 2013-09-29T00:03:59.307 に答える
0

エラー/例外の詳細がなければ、許可の問題か文字の問題のようです。Path.GetInvalidPathCharswithを使用し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);
    }
于 2013-09-29T00:01:23.340 に答える
0

File.Createfilestream新しいファイルへの書き込みに使用できる を返します。しかし、あなたは引数であるパスを提供しているのでは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 文字未満である必要があります。

そのため、パスを短縮する方法を使用する必要があります (名前の重複を避けるために番号を追加するロジックを使用する場合)。

于 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 に答える