откройте файл одним способом и напишите другим - PullRequest
1 голос
/ 14 сентября 2011

Итак, я пытался исправить эту ошибку в течение нескольких дней, используя разные методы, и, похоже, ничего не работает.Вот то, к чему я упростил свой код, чтобы я мог видеть, что идет не так.

Сначала я вызываю метод open(), чтобы открыть файл и прочитать его в моей переменной.Затем я вызываю save() и записываю обратно в тот же файл.

И все же я получаю сообщение об ошибке:

Процесс не может получить доступ к файлу {$ FILE}, поскольку он используется другим процессом

Естьрешение для этого?

private void save()
{
    if (currentFile == null)
    {
        saveAs();
    }
    else
    {
        if (File.OpenWrite(currentFile) != null)
        {
            byte[] buffer = null;
            if (currentEncoding == encoding.utf8)
            {
                buffer = System.Text.Encoding.UTF8.GetBytes(mainTxtBx.Text);
            }
            else
            {
                buffer = System.Text.Encoding.ASCII.GetBytes(mainTxtBx.Text);
            }
            File.WriteAllBytes(currentFile, buffer);
        }
    }
}

private void open()
{
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.InitialDirectory = homePath;
    openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    openFileDialog.FilterIndex = 2;
    openFileDialog.RestoreDirectory = true;
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        currentFile = openFileDialog.FileName.ToString();
        openFileDialog.Dispose();
        if (File.Exists(currentFile))
        {
            byte[] buffer = File.ReadAllBytes(currentFile);
            if (currentEncoding == encoding.utf8)
            {
                mainTxtBx.Text = new string(System.Text.Encoding.UTF8.GetChars(buffer).ToArray());
            }
            else
            {
                mainTxtBx.Text = new string(System.Text.Encoding.ASCII.GetChars(buffer).ToArray());
            }
        }
    }
}

Ответы [ 4 ]

4 голосов
/ 14 сентября 2011

Поскольку вы используете WriteAllBytes, вы можете использовать ReadAllBytes или ReadAllText вместо OpenWrite.


            byte[] buffer = File.ReadAllBytes(currentFile);
            if (currentEncoding == encoding.utf8)
            {
                buffer = System.Text.Encoding.UTF8.GetBytes(mainTxtBx.Text);
            }
            else
            {
                buffer = System.Text.Encoding.ASCII.GetBytes(mainTxtBx.Text);
            }
            File.WriteAllBytes(currentFile, buffer);

2 голосов
/ 14 сентября 2011

Проблема заключается в строке if (File.OpenWrite("test.txt") != null). File.OpenWrite открывает файл для записи и возвращает FileStream. Затем вы открываете файл, пока файл еще открыт, пытаясь записать файл в операторе File.WriteAllBytes(currentFile, buffer);

Попробуйте что-нибудь в этом духе:

        var writer = File.OpenWrite("test.txt");
        using (writer)
        {
            byte[] buffer = null;
            //...
            writer.Write(buffer, 0, buffer.Length);
        }
1 голос
/ 14 сентября 2011

Есть несколько проблем и потенциальных проблем с кодом, но самая непосредственная из них заключается в том, что WriteAllBytes не требует вызова OpenWrite

Когда вы вызываете OpenWrite, вы открываете файл для записи с этим файловым объектом, который возвращается, и запрещаете любые другие попытки открыть файл, пока он снова не закроется. Поскольку вы никогда не вызываете Dispose, он останется заблокированным до завершения вашей программы.

И проблема, связанная с кодом, заключается в том, что вы избавляетесь от диалогового окна только в том случае, если результат равен OK, когда его всегда следует удалять независимо. Вы должны заглянуть в оператор using для обработки утилизации ресурсов. Dispose необходимо вызывать, даже если это исключение, поэтому вам нужно либо обернуть код, который использует одноразовый объект в try..finally, либо использовать using, который сделает это за вас.

1 голос
/ 14 сентября 2011

вам не нужно условие if if (File.OpenWrite(currentFile) != null)

При этом открывается файл, и вы снова пытаетесь открыть тот же файл и записать его, используя WriteAllBytes

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