Как мне написать в скрытый файл? - PullRequest
22 голосов
/ 11 февраля 2010

Я использую 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 ]

39 голосов
/ 11 февраля 2010

Похоже, проблема в том, что проверка типа 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);
}
17 голосов
/ 11 февраля 2010

РЕДАКТИРОВАТЬ 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

9 голосов
/ 05 января 2012

Редактировать: ответ Пьера-Люка Шампиньи был некорректен, но теперь исправлен в соответствии с моим, я оставляю его как ссылку

myFile.Attributes |= FileAttributes.Normal;

не удаляет атрибут Hiddenиз файла.для удаления скрытого атрибута используйте:

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;
0 голосов
/ 11 февраля 2010

После того, как вы открыли файл, вы можете изменить его атрибуты (в том числе и только для чтения) и продолжить запись в него. Это один из способов предотвратить перезапись файла другими процессами.

Таким образом, можно было бы отобразить файл, открыть его, а затем восстановить его как скрытое, даже если он открыт.

Например, работает следующий код:

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 голосов
/ 11 февраля 2010

Вы можете отобразить файл перед записью в него и после завершения записи снова скрыть его.

0 голосов
/ 11 февраля 2010

Если это вариант для вас, вы можете попробовать использовать File.SetAttributes для временного удаления скрытого атрибута, выполните свою работу и затем верните его в предыдущее состояние.

...