2011-02-18 69 views
2

幫助!我無法弄清楚如何關閉文件。它總是給我IOException異常文件,像它正被另一個進程使用IOException文件複製未處理。從picturebox上傳圖片時

這裏是我的代碼

private void uploadpic_btn_Click(object sender, EventArgs e) 
{ 
    open_dialog = new OpenFileDialog(); 

    open_dialog.Title = "Open picture"; 
    open_dialog.Filter = "JPEG (*.jpg;*.jpeg;*.jpe;*.jfif)|*.jpg"; 

    if (open_dialog.ShowDialog() != DialogResult.Cancel) 
    { 
     uploadpic_pb.BackgroundImage = Image.FromFile(open_dialog.FileName); 
     uploadpic_pb.BackgroundImageLayout = ImageLayout.Stretch; 
     uploadpic_pb.BorderStyle = BorderStyle.FixedSingle; 
    } 
} 

private void saveBTN_Click(object sender, EventArgs e) 
{ 
    string targetPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "\\Pictures"); 
    string destFile = Path.Combine(targetPath, "Copied.jpg"); 

    if (!Directory.Exists(targetPath)) 
    { 
     Directory.CreateDirectory(targetPath); 
    } 

    File.Copy(open_dialog.FileName, destFile, true); 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    Image myimage = Image.FromFile(@"C:\Pictures\Copied.jpg"); 

    uploadpic_pb.BackgroundImage = myimage; 
    uploadpic_pb.BackgroundImageLayout = ImageLayout.Stretch; 
    uploadpic_pb.BorderStyle = BorderStyle.FixedSingle; 
}

異常返回

該進程無法訪問文件「C:\ Pictures \ Copied.jpg「,因爲它正在被另一個進程使用。

+0

與代碼描述結合使用時,代碼沒什麼意義。 1)您從不以需要關閉的方式打開任何文件(Image.FromFile和File.Copy不會保留文件打開狀態)。 2)您將圖像保存到MemoryStream中,僅丟棄該流而不使用它(並保證關閉);這是毫無意義的。 3)你不知道拋出異常的地方。 – 2011-02-18 02:32:10

+0

即使我刪除了內存流,結果仍然是一樣的。 IOException總是指向File.Copy行。 – Holyoxx 2011-02-18 02:36:59

回答

3

Image.FromFile()對文件進行寫入鎖定。 Form1_Load()會對Copied.jpg進行鎖定。然後按下uploadpic_btn按鈕將新的位圖分配給BackgroundImage屬性。然後按下saveBTN可能會失敗你寫代碼的方式。 Copied.jpg是仍然是被鎖定,Image對象仍然存在。它不會消失,直到垃圾收集器運行。

爲避免等待,您必須處理圖像。修復:

if (open_dialog.ShowDialog() != DialogResult.Cancel) 
    { 
     if (uploadpic_pb.BackgroundImage != null) uploadpic_pb.BackgroundImage.Dispose(); 
     uploadpic_pb.BackgroundImage = Image.FromFile(open_dialog.FileName); 
     // etc... 
    } 
1

嘗試使用類級別變量作爲文件名而不是targetPath,可能會附加日期時間以保持其唯一性。在File.copy中保留overwrite = false並查看它是否有效。這只是一個測試,看你Copied.Jpg文件正在使用中。

此外 - 在發佈模式下編譯解決方案,並嘗試直接從bin而不是從Visual Studio運行EXE。有時Visual Studio助手進程會阻止文件。