C # - FileStream: и блокировать файл, и в то же время иметь возможность читать его, не обрезая его, и записывать его с урезанием его - PullRequest
7 голосов
/ 27 ноября 2011

Полагаю, мой заголовок не совсем понятен.

Я попытаюсь объяснить:

Я могу написать и прочитать файл, используя FileStream

FileStream fs = new FileStream("C:\\Users\\Public\\text.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);

private void button1_Click(object sender, EventArgs e)
{
    fs.Seek(0,0);
    StreamReader sr = new StreamReader(fs);
    textbox.Text = sr.ReadToEnd();
}

private void button2_Click(object sender, EventArgs e)
{
    StreamWriter sw = new StreamWriter(fs);
    sw.Write(textbox.Text);
    sw.Flush();
}

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

Или я могу сделать это без FileStream:

private void button1_Click(object sender, EventArgs e)
{
    StreamReader sr = new StreamReader("C:\\Users\\Public\\text.txt");
    textBox1.Text = sr.ReadToEnd();
    sr.Close();
}

private void button2_Click(object sender, EventArgs e)
{
    StreamWriter sw = new StreamWriter("C:\\Users\\Public\\text.txt", false);
    sw.Write(textBox1.Text);
    sw.Close();
}

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

Но я хочу и то и другое.Какое решение?

Ответы [ 2 ]

14 голосов
/ 27 ноября 2011

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

private void button2_Click(object sender, EventArgs e)
{
    fs.Seek(0,0);
    fs.SetLength(Encoding.UTF8.GetBytes(textbox.Text).Length));
    StreamWriter sw = new StreamWriter(fs);
    sw.Write(textbox.Text);
    sw.Flush();
}
1 голос
/ 23 октября 2017

Если вы урежете поток до 0, он также будет работать, и нет необходимости вычислять новый размер файла в байтах.

fs.Seek(0,0);
fs.SetLength(0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...