2013-12-20 47 views
0

這是我的代碼部分:該進程無法訪問文件「PDF」,因爲它正被另一個進程使用

foreach (string str in Directory.GetFiles(MapPath("~/_Files/Upload/" + User.Identity.Name + "/"), "RS_*.*")) 
{ 
    MemoryStream ms = new MemoryStream(); 
    System.Drawing.Image.FromFile(str).Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
    cmd.Parameters.Clear(); 
    cmd.CommandText = "INSERT INTO ReportingServiceImages VALUES (@ReportingServiceID, @img)"; 
    cmd.Parameters.AddWithValue("@ReportingServiceID", ID); 
    cmd.Parameters.AddWithValue("@img", ms.GetBuffer()); 
    cmd.ExecuteNonQuery(); 
    ms.Close(); 
    cmd.Dispose(); 
    File.Delete(str); 
} 

當我嘗試刪除str這個IO Exeption拋出:

進程無法訪問文件'pdf',因爲它正在被另一個進程使用。

我該怎麼辦?

+1

'處置圖像! – Rotem

回答

0

調用System.Drawing.Image.FromFile(str)創建這需要一個Image被佈置

foreach (string str in Directory.GetFiles(MapPath("~/_Files/Upload/" + User.Identity.Name + "/"), "RS_*.*")) 
{ 
    using(MemoryStream ms = new MemoryStream()) 
    using(Image img = System.Drawing.Image.FromFile(str)) 
    { 
     img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
     cmd.Parameters.Clear(); 
     cmd.CommandText = "INSERT INTO ReportingServiceImages VALUES (@ReportingServiceID, @img)"; 
     cmd.Parameters.AddWithValue("@ReportingServiceID", ID); 
     cmd.Parameters.AddWithValue("@img", ms.GetBuffer()); 
     cmd.ExecuteNonQuery(); 
     cmd.Dispose(); 
    } 
    File.Delete(str); 
} 

如果cmd實際上不是這種方法的使用外,我想將它包裝在一個using聲明爲好。我沒有看到你的例子中的定義,所以它不清楚它可能用於什麼。

0

當您嘗試訪問的文件未在代碼的其他部分中正確關閉時,Thesse類型的錯誤可能會出錯。

請確認,該file is closed properly之前您要接取它

希望這有助於..

0

當你使用像數據庫連接一次性物品,文件等,嘗試使用以下

using(var file = new ...) 
{ 
    // code goes here 
} 

這樣,當你完成與文件,數據庫連接等相關的所有任務時,相應的對象將被丟棄,隨後在其他地方可以創建另一個對象再唱你的文件。爲什麼在文件中出現這種情況的原因很明顯。假設你已經打開了一個文件,如果你沒有保存任何你想要的文件然後釋放它,你不能創建另一個打開這個文件的對象。如果可能的話,會出現很多不一致的地方。

相關問題