【发布时间】:2017-04-06 20:26:45
【问题描述】:
我正在使用以下代码解压缩 a.gz 文件。由于我有大量文件,我正在使用 TPL 任务来运行此代码。但我曾经得到.NET 异常:
该进程无法访问该文件,因为它正被另一个进程使用。
如何解决这个问题?
使用的代码如下:
private static void Decompress(FileInfo fileToDecompress)
{
using (FileStream originalFileStream = fileToDecompress.OpenRead())
{
string currentFileName = fileToDecompress.FullName;
string newFileName = currentFileName.Remove(currentFileName.Length -
fileToDecompress.Extension.Length);
using (FileStream decompressedFileStream = File.Create(newFileName))
{
using (GZipStream decompressionStream =
new GZipStream(originalFileStream,
CompressionMode.Decompress))
{
decompressionStream.CopyTo(decompressedFileStream);
}
}
}
//File.Move(myffile, Path.ChangeExtension(myffile, ".jpg"));
}
调用代码如下图
var list = ftp.GetFileList(remotepath);
//-------------------
DateTime dt = DateTime.Now;
string st = String.Format("{0:yyyyMMdd}", dt);//20161120
Task[] myTasks = new Task[list.Count];
int i = 0;
foreach (string item in list)
{
if (item.StartsWith("GExport_") && (!item.ToUpper().Contains("DUM")) && (item.Contains(st)) && (!item.ToUpper().Contains("BLK")))
{
4gpath = item;
//Downloadfile()
ftp.Get(dtr["REMOTE_FILE_PATH"].ToString() + 4gpath , @localDestnDir + "\\" + dtr["SOURCE_PATH"].ToString());
download_location_hw = dtr["LOCAL_FILE_PATH"].ToString();
// Spin off a background task to process the file we just downloaded
myTasks[i++] = Task.Factory.StartNew(() =>
{
//Extractfile()
ExtractZipfiles(download_location_hw + "//" + huwawei4gpath, dtr["REMOTE_FILE_PATH"].ToString(),
dtr["FTP_SERVER"].ToString(), dtr["FTP_USER_ID"].ToString(),
dtr["TECH_CODE"].ToString(), dtr["VENDOR_CODE"].ToString());
}
}
}
private static void ExtractZipfiles(string download_location_hw,string remotepath,string server,string userid,string tech,string vendor)
{
if (download_location_hw.Contains(".gz"))
{
DirectoryInfo directorySelected = new DirectoryInfo(Path.GetDirectoryName(download_location_hw));
foreach (FileInfo fileToDecompress in directorySelected.GetFiles("*.gz"))
{
Decompress(fileToDecompress);
}
}
}
【问题讨论】:
-
你能显示调用这个方法的代码吗?特别是 TPL 位
-
我发布了调用代码
-
myTasks有什么用? -
以更快的方式下载和解压大量文件
标签: c# .net file exception task-parallel-library