14

String[] 配列の内容を System.IO.File.WriteAllLines で保存すると、ファイルの最後に常に空白行が残ります。例えば:

System.IO.File.WriteAllLines(Application.dataPath + "/test.txt",["a", "b", "c"]);

ファイルを生成します (アンダースコアなし):

a
b
c
_

すでにそのようなトピックがありました: .Net File.WriteAllLines の空の行はバグですか? 、しかしautorは「私のデータに何か問題があると思います。それは私の問題ですが、WritAllLinesの問題ではありません」と述べ、「ローカライズされすぎている」(?!?)として閉じられました。

バグですか?どうすれば簡単に取り除くことができますか (今のところ、ファイルを再度読み取るときに無視しています)。

4

9 に答える 9

15

他の人が指摘したように、それはまさにそれがどのように機能するかです。余分な改行なしでそれを行う方法は次のとおりです。

public static class FileExt
{
    public static void WriteAllLinesBetter(string path, params string[] lines)
    {
        if (path == null)
            throw new ArgumentNullException("path");
        if (lines == null)
            throw new ArgumentNullException("lines");

        using (var stream = File.OpenWrite(path))
        using (StreamWriter writer = new StreamWriter(stream))
        {
            if (lines.Length > 0)
            {
                for (int i = 0; i < lines.Length - 1; i++)
                {
                    writer.WriteLine(lines[i]);
                }
                writer.Write(lines[lines.Length - 1]);
            }
        }
    }
}

使用法:

FileExt.WriteAllLinesBetter("test.txt", "a", "b", "c");

書いています:

a enter
benter
c
于 2012-07-27T14:14:56.960 に答える
9

このWriteAllLinesメソッドは、配列の各行を書き出し、続いて改行します。これは、常にこの「空の行」がファイルに含まれることを意味します。

リンクした投稿で指摘されたのは、実行時にReadAllLines行が改行で終了する文字と見なされるということです。そのため、書き込んだばかりのファイルに対して read メソッドを使用すると、まったく同じ行が返されるはずです。

ファイルを別の方法で読み取っている場合は、改行を自分で処理する必要があります。

基本的に、あなたが見ているのは期待される動作です。

于 2012-07-27T14:08:58.653 に答える
4

@Virtlink ソリューションはほぼ完璧です。実際、ファイルが存在し、そのコンテンツが新しいコンテンツよりも大きい場合、ファイルの最後にガベージが発生するシナリオがあります。新しいファイルの内容を書き込む前に、ファイルの長さをゼロにリセットしてください。

    public static void WriteAllLinesBetter(string path, params string[] lines)
    {
        if (path == null)
            throw new ArgumentNullException("path");
        if (lines == null)
            throw new ArgumentNullException("lines");

        using (var stream = File.OpenWrite(path))
        {
            stream.SetLength(0);
            using (var writer = new StreamWriter(stream))
            {
                if (lines.Length > 0)
                {
                    for (var i = 0; i < lines.Length - 1; i++)
                    {
                        writer.WriteLine(lines[i]);
                    }
                    writer.Write(lines[lines.Length - 1]);
                }
            }
        }
    }
于 2017-02-03T22:46:09.187 に答える
3

WriteAllLines は、配列内のすべてのエントリを書き込み、改行を追加します。
ご覧のとおり、すべての文字列がそれぞれの行にあります。これは、最後のエントリが改行で終了し、ファイルにもう 1 行あることを意味します。ファイルの16進数のダンプでこれを証明できます

WriteAllLines のソース コードを見ると、これが確認されます。
内部的には、TextWriter.WriteLine(string)メソッドを使用します。

于 2012-07-27T14:08:42.493 に答える
0

私にとって最も簡単な方法は、最後の行に AppendAllText を使用することでした。

if ($i -ne $lines.Count - 1){
     $newLines += $lines[$i]
    } else {
     $lastLine = $lines[$i]
}

[IO.File]::WriteAllLines($file.FullName, $newLines);
[IO.File]::AppendAllText($file.FullName, $lastLine);
于 2016-09-13T10:08:12.020 に答える