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

似乎问题在于这种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);
}
于 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

编辑: Pierre-Luc Champigny 的回答不正确的,但现在根据我的固定,我把它留下作为参考

myFile.Attributes |= FileAttributes.Normal;

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

FileInfo .Attributes &= ~FileAttributes.Hidden; 

此代码检查文件是否存在,使其不隐藏。在写入完成之前,它再次将其设置为隐藏。我还设置了 normal 属性以防不存在 - 你不必使用它

// 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

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

所以似乎可以取消隐藏文件,打开它,然后将其重置为隐藏,即使你已经打开它。

例如,以下代码有效:

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 回答