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

Я получаю двоичные данные из поля базы данных SQL Server и создаю документ локально в каталоге, в котором у моего приложения есть разрешения. Однако я все еще получаю ошибку, указанную в названии. Я пробовал множество предложений, размещенных в Интернете, включая те, которые были предложены в предыдущих сообщениях в Stackoverflow. Я также использовал ProcessExplorer > Find Handle, чтобы найти блокировку и ничего не возвращает, как будто файл не заблокирован.

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

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

Я пропустил что-то совершенно очевидное? Правильно ли я создаю файл из базы данных? Любая помощь в решении или улучшении диагностики проблемы была бы высоко оценена.

// Get file from DB
FileStream fs = new FileStream(
    "C:\myTempDirectory\myFile.doc", FileMode.OpenOrCreate, FileAccess.Write);
BinaryWriter br = new BinaryWriter(fs);
br.Write("BinaryDataFromDB");
fs.Flush();
fs.Close();
fs.Dispose();

// Copy file
File.Copy(sourceFileName, destinationFilename, true);

Ответы

Ответ 1

Попробуйте добавить вызов GC.Collect() после того, как вы удалили свои потоки, чтобы заставить сборщик мусора очистить.

// Get file from DB 
using(FileStream fs = new FileStream("C:\myTempDirectory\myFile.doc", FileMode.OpenOrCreate, FileAccess.Write)) 
using(BinaryWriter br = new BinaryWriter(fs))
{
   br.Write("BinaryDataFromDB"); 
   fs.Flush(); 
}

//Force clean up
GC.Collect();

// Copy file 
File.Copy(sourceFileName, destinationFilename, true); 

Ответ 2

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

    // Get file from DB 
using (FileStream fs = new FileStream("C:\myTempDirectory\myFile.doc", FileMode.OpenOrCreate, FileAccess.Write)) 
{
    BinaryWriter br = new BinaryWriter(fs); 
    br.Write("BinaryDataFromDB"); 
    fs.Flush(); 
    fs.Close(); 
}

// Copy file 
File.Copy(sourceFileName, destinationFilename, true);

Ответ 3

Как насчет using?

string source = @"C:\myTempDirectory\myFile.doc";
using(FileStream fs = new FileStream(
    source, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read))
{
    BinaryWriter br = new BinaryWriter(fs);
    br.Write("BinaryDataFromDB");
}

File.Copy(sourceFileName, destinationFilename, true);

EDIT. Попробуйте сообщить разрешение FileShare.Read.

Ответ 4

Я понял, что хотя отладчик ошибок говорит, что ошибка лежит в этом коде.. Но это не ошибка. Я столкнулся с подобной проблемой, и я пришел с этим решением.. рассмотрю все сообщения выше.. Может быть, это может помочь кому-то...


Я использовал изображение, чтобы показать его в картинке после того, как он вернулся из базы данных и сохранил его как "temp.bmp", используя обычное кодирование, не используя ключевое слово "using", используя этот код:

PictureBox1.Image = Image.FromFile("temp.bmp");

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


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

Bitmap img;
using (Bitmap bmp = new Bitmap("temp.bmp"))
{
    img = new Bitmap(bmp);
}
pictureBox1.Image = img;

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

FileStream fs = new FileStream("filepath",FileMode.Create);

и он работал как кусок пирога


Это действительно помогло

Ответ 5

Возможно ли, что Filestream и BinaryWriter нельзя использовать одновременно? Например, потоковик и очиститель потоков не могут быть вызваны в один и тот же файл. Однако это не имеет смысла, насколько я знаю, в этом случае этого не должно быть. Возможно, попробуйте также закрыть br?

Ответ 6

Попробуйте удалить объект BinaryWriter перед выполнением копии.

Ответ 7

Есть ли фоновый процесс, такой как антивирус или индексация файловой системы, блокируя файл достаточно долго, чтобы вызвать проблемы с вашим приложением? Попробуйте сделать паузу в течение 3 секунд, чтобы увидеть, исчезла ли ваша проблема.

using System.Threading;

fs.Dispose();
Thread.Sleep(3000);
// Copy file

Ответ 8

Вот что я сделал:

Stream stream = new MemoryStream();
var tempStream = new FileStream(pathToFile, FileMode.Open);
tempStream.CopyTo(stream);
tempStream.Close();

тогда используйте объект stream, где хотите.

Ответ 9

Кажется, я столкнулся с этим только после того, как я опубликовал приложение. Если вы закроете окно сообщения и повторите попытку для отладки, ничего не произойдет. Помощник MS говорит, чтобы получить полный выход из Visual Studio и перезапустить его. Его легче поднять диспетчер задач и завершить процесс. Его имя будет именем решения, за которым следует ".vshost" (например, имя проекта: PLC.sln; имя процесса: PLC.vshost.exe). Процесс перезапустится автоматически. В Windows 7 обычно можно увидеть, что что-то происходит при завершении процесса. Но в 10 окно диспетчера задач редко меняется. Я получаю это сообщение, когда пытаюсь проверить программу после смены кода. Очевидно, что .exe не закрывается, когда останавливается отладка и возникает ошибка, когда VS пытается записать вновь исполняемый exe файл. Иногда мне приходится дважды заканчивать процесс, чтобы сообщение об ошибке не возвращалось. (Мне приходится сталкиваться с ошибкой дважды, дважды заканчивая процесс, а повторное воспроизведение не помогает). Это ошибка в Visual Studio.