我正在尝试在Azure云上运行一个运行matlab编译的exe,为此目的需要将v78.zip放到云的本地存储上并解压缩,然后我才能尝试在云。该程序在本地执行时工作正常,但在部署时会在代码中标记为下面的行中出现错误。错误是:
该进程无法访问文件'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)
如果有人能告诉我哪里出错了,那将会很有帮助。
答案 0 :(得分:1)
CloudBlob不是IDisposable,因此您不需要using语句。 (它们只是引用,因此它们不会分配任何需要释放的资源。)
应该,但是,FileStream周围可能有一个using()块。你确定它被关闭了吗?
此代码在哪里运行?它只运行一次吗?
顺便说一下,你可以做“container.GetBlobRefence(”foo“)。DownloadToFile(matlabPath);” (预测你将要使用该文件句柄做什么)。答案 1 :(得分:0)
围绕大部分内容添加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);
答案 2 :(得分:-1)
完成后尝试fs.close()。