Если вы хотите записать в файл, вам нужно получить эксклюзивный доступ к файлу, иначе другие программы могут читать частично записанные данные (ваши записи не являются атомарными). Есть решения для этого, но они довольно сложны.
Решением может быть что-то вроде этого:
static bool Read(FileStream fs, byte[] data, long position)
{
fs.Seek(position, SeekOrigin.Begin);
if (fs.ReadByte() == 0)
{
// Block of data not finished writing
return false;
}
fs.Read(data, 0, data.Length);
return true;
}
static bool Write(FileStream fs, byte[] data, long position)
{
try
{
fs.Lock(position, data.Length + 1);
fs.Seek(position, SeekOrigin.Begin);
fs.WriteByte(0);
fs.Write(data, 0, data.Length);
fs.Seek(position, SeekOrigin.Begin);
fs.WriteByte(1);
fs.Unlock(position, data.Length + 1);
return true;
}
catch (IOException)
{
return false;
}
}
static bool Append(FileStream fs, byte[] data)
{
return Write(fs, data, fs.Length);
}
, где вы всегда оставляете открытым FileStream
как
FileStream fs1 = new FileStream("Test.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
До data
есть «защитный байт», который сообщает, записываются ли данные. Если он пишется, то чтение не удастся. Файл заблокирован "где это необходимо", используя FileStream.Lock
.
Это явно лучше работает с двоичными данными фиксированной длины. Если у вас есть данные переменной длины (или вам нужно атомарно обновить больше «областей» файла), то это становится более сложным. Обычно вы используете БД по этой причине: -)