File.Delete не может удалить файл, так как он используется другим процессом. Не уверен, как это исправить

У меня есть проект, в котором есть веб-форма, которая создает файл .csv на лету, а затем шифруется с помощью GnuPG. Процесс шифрования работает, и зашифрованный файл создается в том же каталоге. Далее, после того как файл зашифрован, мне нужно удалить обычный файл .csv.

Я использовал file.delete для этого, но получаю сообщение об ошибке «Процесс не может получить доступ к файлу« FILEPATH / FILENAME.EXT », потому что он используется другим процессом. Я не уверен, что я разместил код в неправильной области. .

Может ли кто-нибудь предложить мне, что я должен делать? Вот соответствующий код.

public void encryptPGP(string fileName)
{
    try
    {
        string sCommandLine = String.Format(@"-r ""CERT NAME"" -e ""{0}""", fileName);
       //lblError.Text = "<pre>" + sCommandLine + "</pre>";

        string userPwd = "COOLPWD";
        System.Security.SecureString pwd = new System.Security.SecureString();
        foreach (char c in userPwd.ToCharArray())
        {
            pwd.AppendChar(c);
        }

        System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo();
        info.Arguments = sCommandLine;
        info.Domain = "DOMAINNAME";
        info.FileName = "C:\\Utilities\\GnuPG\\App\\gpg.exe";
        info.Password = pwd;
        info.UserName = "USERNAME";
        info.UseShellExecute = false;
       info.RedirectStandardOutput = true;
       info.CreateNoWindow = true;
        info.WorkingDirectory = "C:\\Utilities\\GnuPG\\App\\";

        //writeToLog(info.FileName, "App");
        //writeToLog(sCommandLine, "Args");

       System.Diagnostics.Process proc = new System.Diagnostics.Process();
       proc.StartInfo = info;
        proc.Start();
       lblError.Text = proc.StandardOutput.ReadToEnd();

    System.IO.File.Delete(fileName);

    }
    catch (Exception ex)
    {
       lblError.Text = ex.Message;
        //writeToLog(ex.Message, "");
    }
}

// method for writing error log
private void writeToLog(string strMessage, string strMethod)
{
    using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\\Log.txt", true))
    {
        file.WriteLine(string.Format("{0} - {1} - {2}", DateTime.Now, strMethod, strMessage));
    }
}
// end method for writing error log

Кроме того, вот процесс создания файла:

        string fileName = @"c:\DIR\DIR\" + pt.SelectedItem.Value + pcf + "--" + usname + "--" + sname.Text + "--" + cdt + ".csv";
    string lines = DropDownList3.SelectedItem.Value + "," + DropDownList8.SelectedItem.Value + "," + DropDownList1.SelectedItem.Value + "," + TextBox25.Text + "," + ssn.Text + "," + TextBox13.Text + "," + Lastname.Text + "," + firstname.Text + "," + " " + "," + TextBox1.Text + "," + TextBox3.Text + "," + TextBox4.Text + "," + TextBox5.Text + "," + TextBox6.Text + "," + TextBox9.Text + "," + TextBox10.Text + "," + TextBox11.Text + "," + TextBox2.Text + "," + " " + "," + TextBox22.Text + "," + TextBox26.Text + "," + TextBox29.Text + "," + TextBox19.Text + "," + TextBox27.Text + "," + TextBox30.Text + "," + TextBox24.Text + "," + TextBox28.Text + "," + TextBox8.Text + "," + DropDownList7.SelectedItem.Value + "," + TextBox38.Text + " " + TextBox34.Text + "," + TextBox33.Text + "," + TextBox41.Text + "," + TextBox35.Text + "," + TextBox36.Text + "," + TextBox37.Text + "," + TextBox54.Text + "," +" "+"," + TextBox12.Text;
    System.IO.File.WriteAllText(fileName, lines);

    encryptPGP(fileName);

person user1714466    schedule 02.10.2012    source источник
comment
вы можете использовать это решение stackoverflow.com/questions/13262548/   -  person kplshrm7    schedule 25.02.2016


Ответы (2)


Я бы сказал, что GnuPG все еще использует файл, когда вы пытаетесь его удалить.

Перед удалением нужно дождаться окончания процесса, т.е. добавить:

proc.WaitForExit(); 

непосредственно перед

System.IO.File.Delete(fileName); 
person Justin Harvey    schedule 02.10.2012
comment
Это полностью решило мою проблему. Благодарю вас! - person user1714466; 02.10.2012

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

Какой бы у вас ни был код, создающий этот файл, он должен иметь поток некоторого описания. Проверьте, есть ли на нем метод Close. Можете ли вы опубликовать код, который создает файл в первую очередь?

person Sachin Kainth    schedule 02.10.2012
comment
Я довольно новичок в С# и учусь на ходу. Как бы я это сделал? Я обновил приведенный выше код, чтобы показать создание файла. Спасибо! - person user1714466; 02.10.2012