Похоже, проблема в том, что проверка типа 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);
}