26

TextWriter を使用して隠しファイルに書き込もうとしていますが、例外がスローされています。隠しファイルへの書き込み方法がわかりません。

using (TextWriter tw = new StreamWriter(filename))
{
    tw.WriteLine("foo");
    tw.Close();
}

例外:

Unhandled Exception: System.UnauthorizedAccessException: 
Access to the path 'E:\*\media\Photos\2006-08\.picasa.ini' is denied.

隠しファイルに書き込むにはどうすればよいですか?

4

6 に答える 6

50

問題は、その種のチェックが内部的に行われることであり、ファイルが非表示の場合 (たとえば、既に存在するファイルに対して aFile.Exists()を実行しようとする場合) に失敗するようです。FileMode.Create

したがって、FileMode.OpenOrCreateファイルが非表示の場合でもファイルが開かれていること、または作成されていることを確認する場合、またはファイルがFileMode.Open存在しない場合に作成したくない場合に使用します。

ただし、 を使用するFileMode.OpenOrCreateと、ファイルは切り捨てられないため、テキストの末尾に余白が残らないように、末尾に長さを設定する必要があります。

using (FileStream fs = new FileStream(filename, FileMode.Open)) {
  using (TextWriter tw = new StreamWriter(fs)) {
    // Write your data here...
    tw.WriteLine("foo");
    // Flush the writer in order to get a correct stream position for truncating
    tw.Flush();
    // Set the stream length to the current position in order to truncate leftover text
    fs.SetLength(fs.Position);
  }
}

.NET 4.5 以降を使用している場合は、新しいオーバーロードがありStreamWriter、基になるストリームも破棄するために破棄されます。コードは、次のように、より直感的に少し書くことができます。

using (FileStream fs = new FileStream(filename, FileMode.Open)) {
  using (TextWriter tw = new StreamWriter(fs, Encoding.UTF8, 1024, true)) {
    // Write your data here...
    tw.WriteLine("foo");
  }
  // Set the stream length to the current position in order to truncate leftover text
  fs.SetLength(fs.Position);
}
于 2010-02-11T19:28:03.413 に答える
20

編集2:この答えは問題を解決しますが、問題に対処する正しい方法ではありません。ルセロの答えを探す必要があります。


この回答は次のサイトから取得しました:http://www.dotnetspark.com/Forum/314-accessing-hidden-files-and-write-it.aspx

1-ファイルを表示可能に設定して上書きできるようにします

// Get file info
FileInfo myFile= new FileInfo(Environment.CurrentDirectory + @"\hiddenFile.txt");

// Remove the hidden attribute of the file
myFile.Attributes &= ~FileAttributes.Hidden;

2-ファイルに変更を加えます

// Do foo...

3-ファイルを非表示に戻します

// Put it back as hidden
myFile.Attributes |= FileAttributes.Hidden;

編集:私はbrilerによって言及されたように私の答えのいくつかの問題を修正しました

于 2010-02-11T19:13:14.000 に答える
10

編集:ピエール=リュックシャンピニーの答え間違っていましたが、私のものによると修正されました、私はそれを参照として残しています

myFile.Attributes |= FileAttributes.Normal;

ファイルからHidden属性を削除しません。非表示の属性を削除するには、次を使用します。

FileInfo .Attributes &= ~FileAttributes.Hidden; 

このコードは、ファイルが存在するかどうかをチェックして、ファイルを非表示にします。一度書く前に、それを再び非表示に設定します。が存在しなかった場合に備えて、通常の属性も設定しました。使用する必要はありません。

// if do not exists it creates it.
FileInfo FileInfo = new FileInfo(FileName);
if (true == FileInfo .Exists)
{
   // remove the hidden attribute from the file
   FileInfo .Attributes &= ~FileAttributes.Hidden; 
} //if it doesn't exist StreamWriter will create it
using (StreamWriter fileWriter = new StreamWriter(FileName))
{
   fileWriter.WriteLine("Write something");
}
 // set the file as hidden
FileInfo.Attributes |= FileAttributes.Hidden;
于 2012-01-05T09:38:42.327 に答える
0

それがオプションである場合はFile.SetAttributes、非表示の属性を一時的に削除するために使用して、作業を行ってから、以前の状態に戻すことができます。

于 2010-02-11T19:12:37.277 に答える
0

ファイルに書き込む前にファイルを再表示し、書き込みが完了したら再び非表示にすることができます。

于 2010-02-11T19:14:00.623 に答える
0

ファイルを開いたら、その属性を変更して (読み取り専用を含む)、書き込みを続けることができます。これは、ファイルが他のプロセスによって上書きされるのを防ぐ 1 つの方法です。

そのため、ファイルを開いている間でも、ファイルを再表示して開き、非表示にリセットすることができるようです。

たとえば、次のコードは機能します。

public void WriteToHiddenFile(string fname)
{
    TextWriter    outf;
    FileInfo      info;  

    info = new FileInfo(fname);
    info.Attributes = FileAttributes.Normal;    // Set file to unhidden
    outf = new StreamWriter(fname);             // Open file for writing
    info.Attributes = FileAttributes.Hidden;    // Set back to hidden
    outf.WriteLine("test output.");             // Write to file
    outf.Close();                               // Close file
}

プロセスがファイルに書き込んでいる間、ファイルは非表示のままであることに注意してください。

于 2010-02-11T19:23:20.723 に答える