2011-12-22 1 views
17

コードを変更して、ファイルを読み取り専用で開くことができました。 FileStreamStreamReaderが文字列に変換されていないため、File.WriteAllTextを使用して問題が発生しました。StreamReaderを文字列に変換するにはどうすればよいですか?

これは私のコードです:アクセス後のStreamReaderを閉じるには、当然のことながら、重要である

string content = new StreamReader(fs, Encoding.Unicode).ReadToEnd(); 

static void Main(string[] args) 
{ 
    string inputPath = @"C:\Documents and Settings\All Users\Application Data\" 
        + @"Microsoft\Windows NT\MSFax\ActivityLog\OutboxLOG.txt"; 
    string outputPath = @"C:\FAXLOG\OutboxLOG.txt"; 

    var fs = new FileStream(inputPath, FileMode.Open, FileAccess.Read, 
             FileShare.ReadWrite | FileShare.Delete); 
    string content = new StreamReader(fs, Encoding.Unicode); 

    // string content = File.ReadAllText(inputPath, Encoding.Unicode); 
    File.WriteAllText(outputPath, content, Encoding.UTF8); 
} 
+0

'StreamReader'は' string'ではありません。あなたがコメントアウトした 'File.ReadAllText'メソッドを使うと' string'が得られます。 –

+0

ファイルの内容を別のディレクトリにコピーしているようです。なぜファイルのコピーを出力ディレクトリに直接作成しないのですか? – docmanhattan

+0

ねえ、あなたの最後の投稿について私のコメントを解読できたことをうれしく思っています...あなたのFileStreamで 'using'をやってみてください...ディスクIOをやっているときはいつでも試してみる必要があります...多くの潜在的な問題があります。それ以外のこれらのStreamReader.ReadToEnd()の回答は必要なものです。 – rfmodulator

答えて

39

は、StreamReaderをのReadToEnd()メソッドを使用します。したがってkeyboardPなどで示唆されているように、usingのステートメントが意味を持ちます。

string content; 
using(StreamReader reader = new StreamReader(fs, Encoding.Unicode)) 
{ 
    content = reader.ReadToEnd(); 
} 
+8

ストリームのために 'using'ステートメントを使うことをお勧めします。 – albertjan

+0

を使用し、文字列連結の代わりにPath.Combine(...)を使用しています。私は私の答えからノイズを削除しました。 – Adam

+3

私の答えが受け入れられたので、@ keyboardPの答えのようにusingステートメントを含むように拡張しました。 – Adam

11
string content = String.Empty; 

using(var sr = new StreamReader(fs, Encoding.Unicode)) 
{ 
    content = sr.ReadToEnd(); 
} 

File.WriteAllText(outputPath, content, Encoding.UTF8); 
+3

StreamReaderを廃棄するためにusingステートメントを追加する場合は+1 – Jason

+1

実際には、重要なポイントです。 – Adam

3

StreamReader.ReadToEnd()メソッドを使用します。

関連する問題