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

Я пытаюсь запустить исполняемый файл, скомпилированный в Matlab, в облаке Azure, и для этой цели мне нужно получить v78.zip в локальном хранилище облака и разархивировать его, прежде чем я смогу попытаться запустить exe в облаке. Программа отлично работает при локальном выполнении, но при развертывании выдает ошибку в строке, отмеченной ниже в коде. Ошибка:

Процесс не может получить доступ к файлу «C: \ Resources \ directory \ cc0a20f5c1314f299ade4973ff1f4cad.WebRole.LocalStorage1 \ v78.zip», потому что он используется другим процессом.

Сведения об исключении: System.IO.IOException: процесс не может получить доступ к файлу «C: \ Resources \ directory \ cc0a20f5c1314f299ade4973ff1f4cad.WebRole.LocalStorage1 \ v78.zip», поскольку он используется другим процессом.

Код приведен ниже:

string localPath = RoleEnvironment.GetLocalResource("LocalStorage1").RootPath;

Response.Write(localPath + " \n");

Directory.SetCurrentDirectory(localPath);

CloudBlob mblob = GetProgramContainer().GetBlobReference("v78.zip");
CloudBlockBlob mbblob = mblob.ToBlockBlob;

CloudBlob zipblob = GetProgramContainer().GetBlobReference("7z.exe");

string zipPath = Path.Combine(localPath, "7z.exe");
string matlabPath = Path.Combine(localPath, "v78.zip");
IEnumerable<ListBlockItem> blocklist = mbblob.DownloadBlockList();


BlobStream stream = mbblob.OpenRead();
>>  FileStream fs = File.Create(matlabPath);    (Exception occurs here)

Было бы здорово, если бы кто-нибудь сказал мне, в чем я ошибаюсь.


person Shantanu    schedule 29.05.2010    source источник


Ответы (3)


CloudBlob не являются IDisposable, поэтому вам не нужен оператор using. (Это просто ссылки, поэтому они не выделяют ресурсы, которые необходимо высвободить.)

Однако вы должны иметь блок using () вокруг FileStream. Вы уверены, что он закрывается?

Где работает этот код? Он запускается только один раз?

Кстати, вы можете просто сделать "container.GetBlobRefence (" foo "). DownloadToFile (matlabPath);" (ожидая, что вы собираетесь делать с этим дескриптором файла).

person user94559    schedule 30.05.2010

Добавьте предложение using вокруг большей части этого. У вас есть дескриптор вашего zip-файла. Когда использование выходит за рамки, ссылка на файл тоже.

using(CloudBlob mblob = GetProgramContainer().GetBlobReference("v78.zip"))
{
        CloudBlockBlob mbblob = mblob.ToBlockBlob;

        CloudBlob zipblob = GetProgramContainer().GetBlobReference("7z.exe");

        string zipPath = Path.Combine(localPath, "7z.exe");
        string matlabPath = Path.Combine(localPath, "v78.zip");
        IEnumerable<ListBlockItem> blocklist = mbblob.DownloadBlockList();


        BlobStream stream = mbblob.OpenRead();
}
 FileStream fs = File.Create(matlabPath);
person Dan    schedule 30.05.2010
comment
Привет, Дэн, Спасибо за предложение. Я столкнулся с двумя проблемами при его реализации: во-первых, using ожидает тип, неявно конвертируемый в System.IDisposable, а во-вторых, внутри using stmt u поместил (в приведенном выше коде) объявления и присваивания, на которые есть ссылки вне использования. Это не сработает? Я что-то упустил? - person Shantanu; 30.05.2010

Когда закончите, попробуйте fs.close ().

person Sunipa    schedule 09.08.2010