Ошибка: процесс не может получить доступ к файлу, потому что он используется другим процессом - PullRequest
1 голос
/ 25 января 2012

Я работаю в приложении ASP.NET и читаю текстовый файл с разделителями. После прочтения файла, когда я пытаюсь переименовать файл (с помощью функции «Переместить»), я получаю сообщение об ошибке: «Процесс не может получить доступ к файлу, потому что он используется другим процессом». Я не могу ни переименовать, ни удалить файл вручную, пока не перезапущу Windows. Мой код следующий:

   FileStream fileStream = new FileStream(file, FileMode.Open);
               try
               {
                   readImport(file);
               }
               finally
               {
                   fileStream.Close();
               }
                 File.Move(file, Path.Combine(fullFolderPath, fullNewFileName));

и функция, обрабатывающая файл:

 private void readImport(string fullFileName)
{
    try
    {
           TextFieldParser parser = new TextFieldParser(fullFileName);

            parser.Delimiters = new string[] { "|" };
            parser.TrimWhiteSpace = true;
            parser.ReadLine();

            while (!(parser.EndOfData == true))
            {
               // dt.Rows.Add(parser.ReadFields());
            }
   }
        }

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Кевин прав, что файл TextFieldParser, неправильно расположенный, заблокирует файл, заставив file.move вызвать исключение. В VB:

    Dim TextParser As New FileIO.TextFieldParser("C:\Users\Smith\Desktop\example.txt")
    TextParser.textFieldType = FileIO.FieldType.Delimited
    TextParser.SetDelimiters(",")

    While Not TextParser.EndOfData
        'process input
        'x = TextParser.ReadFields()
    End While

    TextParser.Dispose()

Теперь следующая строка будет работать без проблем

File.Move("C:\Users\Smith\Desktop\example.txt", "C:\Users\Smith\Desktop\Archive\example.txt")
1 голос
/ 25 января 2012

Во-первых, вам нужно убедиться, что fileStream расположен:

using (FileStream fileStream = new FileStream(file, FileMode.Open))
{
    readImport(file);
}

File.Move(file, Path.Combine(fullFolderPath, fullNewFileName));

См. MSDN относительно оператора using вместо try/finally.

ПУТЬ - Что здесь делает fileStream ???Кажется, ничего.Используйте это вместо:

readImport(file);
File.Move(file, Path.Combine(fullFolderPath, fullNewFileName));

И вы также должны распоряжаться TextFieldParser:

private void readImport(string fullFileName)
{
    using (TextFieldParser parser = new TextFieldParser(fullFileName))
    {
        parser.Delimiters = new string[] { "|" };
        parser.TrimWhiteSpace = true;
        parser.ReadLine();

        while (!(parser.EndOfData == true))
        {
            // dt.Rows.Add(parser.ReadFields());
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...