【问题标题】:How do I write to a hidden file?如何写入隐藏文件?
【发布时间】:2011-01-15 20:40:57
【问题描述】:

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

如何写入隐藏文件?

【问题讨论】:

  • 它抛出的异常是什么?
  • 抛出了什么异常?
  • 我不知道有没有人在找它,但我添加了例外以防万一。
  • 我喜欢答案和 cmets 一样冗长。
  • @eyelidlessness:在这个问题中,答案的数量很多,而不是质量...... ;)

标签: c# file hidden


【解决方案1】:

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

【讨论】:

  • 赞成,因为这是正确的操作......不是“取消隐藏文件,写入文件,然后再次隐藏”过程
  • 感谢您澄清为什么会发生这种情况,因为我没有看到“隐藏”属性如何影响文件权限。
  • @DaveVandenEynde,不客气。不幸的是,大多数访问此问题的人似乎都没有意识到来回更改属性并不是真正的解决方案,而只是一种脆弱的解决方法。
  • tw.Close() 是不必要的
  • @SergeyT 您当然是正确的,但我将其包含在答案中,因为这是问题中 OP 的 sn-p。我刚刚修改了StreamWriter 创建来展示如何处理隐藏文件。
【解决方案2】:

编辑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 提到的答案中的一些问题

【讨论】:

  • @Lucero 我修正了我的答案
  • 取消设置 hidden 属性,然后在写入文件后重新设置 hidden 会带来很多问题。只需使用正确处理此问题的 FileStream 重载之一,如@Lucero answer中所述。
  • 查看@Lucero 的答案,无需更改属性即可写入隐藏文件。
【解决方案3】:

编辑: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;

【讨论】:

  • 好吧,我在回答中解决了问题,对此感到抱歉
  • 为什么首先取消隐藏文件?您正在修改文件的状态。
  • 因为你通常会得到一个UnauthorizedAccessException,所以请看最初的问题。
【解决方案4】:

如果这对您来说是一个选项,您可以尝试使用File.SetAttributes 暂时删除隐藏属性,完成您的工作,然后将其设置回之前的状态。

【讨论】:

  • 错误选项,正如我在另一个答案中提到的那样
【解决方案5】:

您可以在写入文件之前取消隐藏文件,完成写入后再次隐藏它。

【讨论】:

    【解决方案6】:

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

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

    例如,以下代码有效:

    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
    }
    

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

    【讨论】:

    • 错误选项。如果在取消设置隐藏属性和重置隐藏属性之间发生了一些事情,那么您已经不必要地更改了文件的状态。简单地使用 FileStream ctor 的重载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    相关资源
    最近更新 更多