如何写入隐藏文件?

时间:2010-02-11 19:09:32

标签: c# file hidden

我正在使用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.

如何写入隐藏文件?

6 个答案:

答案 0 :(得分:39)

似乎问题是内部完成了File.Exists()检查,如果文件被隐藏(例如尝试对已经存在的文件执行FileMode.Create)则会失败。< / p>

因此,使用FileMode.OpenOrCreate确保文件即使被隐藏也是打开或创建的,如果您不想创建文件,则使用FileMode.Open。< / p>

虽然使用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);
}

答案 1 :(得分:17)

编辑2:这个答案解决了问题,但不是解决问题的正确方法。你应该寻找Lucero的答案。


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提到的答案中修正了一些问题

答案 2 :(得分:9)

编辑:Pierre-Luc Champigny回答 inccorect,但现在按照我的说法固定, 我将它留作参考

myFile.Attributes |= FileAttributes.Normal;

不会从文件中删除隐藏属性。 为了删除unhidden属性使用:

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;

答案 3 :(得分:0)

如果这是您的选项,您可以尝试使用File.SetAttributes暂时删除隐藏属性,执行您的工作,然后将其重新设置为之前的状态。

答案 4 :(得分:0)

您可以在写入之前取消隐藏文件,完成后再将其隐藏起来。

答案 5 :(得分:0)

打开文件后,您可以更改其属性(包括只读)并继续写入文件。这是防止文件被其他进程覆盖的一种方法。

所以似乎可以取消隐藏文件,打开文件,然后将其重置为隐藏文件,即使在打开文件时也是如此。

例如,以下代码有效:

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
}

请注意,当进程写入文件时,文件仍保持隐藏状态。