我正在使用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.
如何写入隐藏文件?
答案 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
}
请注意,当进程写入文件时,文件仍保持隐藏状态。