web-dev-qa-db-ja.com

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

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.

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

23
esac

編集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によって言及されたように私の答えのいくつかの問題を修正しました

19

問題は、一種のFile.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);
}
44
Lucero

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

0
Tomas Vana

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

0
viky

ファイルを開いたら、その属性を変更して(読み取り専用を含む)、書き込みを続行できます。これは、ファイルが他のプロセスによって上書きされるのを防ぐ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
}

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

0
David R Tribble