Процесс не может получить доступ к файлу <filepath>, поскольку он используется другим процессом - PullRequest
0 голосов
/ 26 января 2011

Я загружаю большие файлы, разделяя их на куски (мелкие части) на своем веб-сервисе ASMX (asmx не поддерживает потоковую передачу, я не нашел другого способа):

bool UploadChunk(byte[] bytes, string path, string md5)
{
      ...
      using (FileStream fs = new FileStream(tempPath, FileMode.Append) )
      {   
            fs.Write( bytes, 0, bytes.Length );
      }
      ...
      return status;
}

, но в некоторых файлах~ 20-50 вызывает, я ловлю эту ошибку:Процесс не может получить доступ к файлу, потому что он используется другим процессом.Я подозреваю, что это связано с Windows не может реализовать файл.Есть идеи, чтобы избавиться от этой скучной ошибки? EDIT запросы выполняются последовательно и синхронно

EDIT2

код клиента выглядит так:

_service.StartUpload(path);

...
do
{
..
bool status = _service.UploadChunk(buf, path, md5);
if(!status)return Status.Failed;
..
}
while(bytesRead > 0);

_service.CheckFile(path, md5);

Ответы [ 4 ]

2 голосов
/ 26 января 2011

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

Как правило, для передачи файлов следует использовать протоколы передачи файлов.ASMX не подходит для этого.

И, я полагаю, у вас есть веская причина не использовать WCF?

0 голосов
/ 19 августа 2013

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

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

0 голосов
/ 19 августа 2013

используйте это для создания файла

если вы хотите что-то добавить, добавьте FileMode.Append

var filestreama = new FileStream(name, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
0 голосов
/ 27 января 2011

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

Вариант 2. Посмотрите на WSE 3.0. Я мало на это смотрел, но думаю, что он расширяет веб-сервисы ASMX для поддержки таких вещей, как DIME и MTOM, которые предназначены для передачи файлов, что может помочь.

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

...