Подтвердить что ты не робот

Как написать в скрытый файл?

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

Как я могу написать скрытый файл?

4b9b3361

Ответ 1

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

РЕДАКТИРОВАТЬ: я исправил некоторую проблему в своем ответе, как упоминал Бритлер

Ответ 2

Кажется, что проблема в том, что проверка 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, false)) {
    // 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);
}

Ответ 3

Изменить: Пьер-Люк Шампиньи ответил был inccorect, но теперь зафиксирован в соответствии с моим, Я оставляю его как ссылку

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;

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

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
}

Обратите внимание, что файл остается скрытым во время записи процесса.