首先,大家好,我只想添加從鏈接下載 zip 檔案然后解壓縮的按鈕,我遇到了問題,我收到此錯誤:
“System.IO.IOException: '該行程無法訪問檔案 'C:\GTA\TEST.zip',因為它正被另一個行程使用。'”
看起來很簡單,但我無法解決,所以我希望你們能幫助我。這是代碼:
private void button2_Click(object sender, EventArgs e)
{
string root = @"C:\GTA";
//this if directory doesn't exist
if (!Directory.Exists(root))
{
Directory.CreateDirectory(root);
}
progressBar1.Value = 0;
WebClient webcl = new WebClient();
webcl.DownloadFileCompleted = Webcl_DownloadFileCompleted;
webcl.DownloadProgressChanged = Webcl_DownloadProgressChanged;
webcl.DownloadFileAsync(new Uri("https://download1474.mediafire.com/17r5hin4vceg/izkb8vk7pudg5g4/TEST.zip"), @"C:\GTA\TEST.zip");
string targetfolder = @"C:\GTA\UNZIPEDFolder";
string sourceZipFile = @"C:\GTA\TEST.zip";
ZipFile.ExtractToDirectory(sourceZipFile, targetfolder);
}
uj5u.com熱心網友回復:
我不是這里的專家,但是您無需等待即可異步獲取檔案。下載檔案異步
因此,您可以在下載檔案時呼叫以提取檔案。
uj5u.com熱心網友回復:
您ExtractToDirectory在實際下載檔案之前呼叫,因為檔案下載是異步的。因此,您需要await在下載程序完成時。為此,您將需要以下內容
- 使整個事件單擊處理程式
async-private async void button2_Click(object sender, EventArgs e)。 - 替換
DownloadFileAsyncwhich 回傳void,因此async/await對DownloadFileTaskAsync,這是可等待的不友好。 - 然后你就可以
await下載了await webcl.DownloadFileTaskAsync(...args here...); - 最后,您可以洗掉
DownloadFileCompleted訂閱,因為您可以確定在await檔案下載完成后。
順便說一句,WebClient被認為是舊的 API,不建議在新代碼中使用。您可以考慮切換到HttpClient.
uj5u.com熱心網友回復:
為了詳細說明前兩個答案,您實際上是在下載檔案之前嘗試解壓縮檔案。您應該按如下方式更改代碼:
private async void button2_Click(object sender, EventArgs e)
{
string root = @"C:\GTA";
//this if directory doesn't exist
if (!Directory.Exists(root))
{
Directory.CreateDirectory(root);
}
progressBar1.Value = 0;
WebClient webcl = new WebClient();
webcl.DownloadFileCompleted = Webcl_DownloadFileCompleted;
webcl.DownloadProgressChanged = Webcl_DownloadProgressChanged;
await webcl.DownloadFileAsync(new Uri("https://download1474.mediafire.com/17r5hin4vceg/izkb8vk7pudg5g4/TEST.zip"), @"C:\GTA\TEST.zip");
string targetfolder = @"C:\GTA\UNZIPEDFolder";
string sourceZipFile = @"C:\GTA\TEST.zip";
ZipFile.ExtractToDirectory(sourceZipFile, targetfolder);
}
注意 theasync和awaitbefore DownloadFileAsync()。
此外,您可能需要稍微重構一下并將下載/解壓縮部分移出按鈕事件處理程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/388667.html
