none
無法刪除檔案,檔案正在使用中無法刪除 RRS feed

  • 問題


  • Code Snippet

    GET_1_count = 0
    while(GET_1_count < 999)
    {
    FileName = @"\TEST\TEST";
    FileName = FileName + GET_1_count.ToString("D3") + ".jpg";
    System.Drawing.Bitmap bm001 = new System.Drawing.Bitmap(FileName);
    pictureBox1.Image = System.Drawing.Image.FromHbitmap(bm001.GetHbitmap());

    if (GET_1_count != 0)
    {
    GET_1_count--;
    File.Delete("\\TEST\\TEST" + GET_1_count.ToString("D3") + ".jpg");//這行會顯示目前檔案在使用中無法刪除
    GET_1_count++;
    }

    GET_1_count++;
    }

    上列程式 我想要連續顯示圖片 顯示完並且刪除但是 執行到我有註解的那一行時 他會說 目前檔案TEST000.JPG在使用中無法刪除 請問 各位大大 該如何處理 (我有 故意等到 顯示到第3張圖片時 在去刪除第一張 也是一樣的狀況)

    2008年1月25日 下午 11:11

解答

  • 將檔案先讀到 MemoryStream 中,再用 MemoryStream 中的資料產生圖片。

     

    Code Snippet

    using System.IO;

     

    GET_1_count = 0
    while(GET_1_count < 999)
    {

    MemoryStream ms = new MemoryStream();

    FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read);

    byte[] data = new byte[(int)fs.Length];


    FileName = @"\TEST\TEST";
    FileName = FileName + GET_1_count.ToString("D3") + ".jpg";


     

    fs.Read(data, 0, (int)fs.Length);

    ms.Write(data, 0, data.Length);

    fs.Close();

     

    pictureBox1.Image = System.Drawing.Bitmap.FromStream(ms);


    if (GET_1_count != 0)
    {
    GET_1_count--;
    File.Delete("\\TEST\\TEST" + GET_1_count.ToString("D3") + ".jpg");
    GET_1_count++;
    }

    GET_1_count++;
    }

     

     

    2008年1月26日 上午 01:37
    版主
  • private const string path = @"c:\tmp\pics";
     
    private void button1_Click(object sender, EventArgs e)
    {
        DirectoryInfo di = new DirectoryInfo(path);
        FileStream fs;
        StringBuilder oldFile = new StringBuilder("-1");
     
        foreach (FileInfo fi in di.GetFiles())
        {
            if (oldFile.ToString() != "-1")
            {
                File.Delete(oldFile.ToString());
            }
     
            oldFile.Replace(oldFile.ToString(), fi.FullName);
            fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read);
            pictureBox1.Image = Image.FromStream(fs);
            fs.Close();
            Application.DoEvents();
        }
     
        File.Delete(oldFile.ToString());
    }
    2008年1月26日 上午 03:03

所有回覆

  • 將檔案先讀到 MemoryStream 中,再用 MemoryStream 中的資料產生圖片。

     

    Code Snippet

    using System.IO;

     

    GET_1_count = 0
    while(GET_1_count < 999)
    {

    MemoryStream ms = new MemoryStream();

    FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read);

    byte[] data = new byte[(int)fs.Length];


    FileName = @"\TEST\TEST";
    FileName = FileName + GET_1_count.ToString("D3") + ".jpg";


     

    fs.Read(data, 0, (int)fs.Length);

    ms.Write(data, 0, data.Length);

    fs.Close();

     

    pictureBox1.Image = System.Drawing.Bitmap.FromStream(ms);


    if (GET_1_count != 0)
    {
    GET_1_count--;
    File.Delete("\\TEST\\TEST" + GET_1_count.ToString("D3") + ".jpg");
    GET_1_count++;
    }

    GET_1_count++;
    }

     

     

    2008年1月26日 上午 01:37
    版主
  • private const string path = @"c:\tmp\pics";
     
    private void button1_Click(object sender, EventArgs e)
    {
        DirectoryInfo di = new DirectoryInfo(path);
        FileStream fs;
        StringBuilder oldFile = new StringBuilder("-1");
     
        foreach (FileInfo fi in di.GetFiles())
        {
            if (oldFile.ToString() != "-1")
            {
                File.Delete(oldFile.ToString());
            }
     
            oldFile.Replace(oldFile.ToString(), fi.FullName);
            fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read);
            pictureBox1.Image = Image.FromStream(fs);
            fs.Close();
            Application.DoEvents();
        }
     
        File.Delete(oldFile.ToString());
    }
    2008年1月26日 上午 03:03
  • 感謝 小朱大大的指導

    其中

    pictureBox1.Image = System.Drawing.Bitmap.FromStream(ms);

     有問題,但是我改成

    System.Drawing.Bitmap bm001 = new System.Drawing.Bitmap(ms);

    pictureBox1.Image = bm001;

    就可以正確執行了,謝謝

    2008年1月26日 上午 06:42
  • 也感謝  chhuang大大的指導

    你的方法對於檔案管理更有效率

    因為我是在網路邊傳輸資料邊顯示邊刪除

    沒有改太多 很謝謝你的指導

    2008年1月26日 上午 06:46
  •  

    小朱大大我突然想到一個問題

    就是你提供的方法是可行的

    但是我的程式流程大致上是

     

    先執行過

                    pictureBox1.Enabled = true;
                    pictureBox1.Visible = true;

     

    在執行

    上列秀圖的檔案

    最後關閉秀圖檔案

    然後在

                    pictureBox1.Enabled = false;
                    pictureBox1.Visible = false;

     

     

    問題來了 在執行第2次的時候

    一樣先執行

                    pictureBox1.Enabled = true;
                    pictureBox1.Visible = true;

    此時會顯示 上次執行最後一次的畫面

    然在在開始顯示新畫面

    這樣是不是代表記憶體並沒有清除舊資料

     

    (所謂第二次可以指我程式並未關閉只是在重新執行一次,但是也可以指我程式完整關閉以後再重新執行程式)

    1.

    我程式 是  點個開始按鈕 會去抓網路上ip camera的圖檔,然後顯示然後刪除,所才會提出上次的問題

    另外點個停止按鈕會停止

    但是再點開始按鈕繼續時會跑出上次最後一個畫面

    2.

    但是我也試過 點開始 然後點停止 然後關閉程式  再重新點程式執行  然後再點開始按鈕 一樣會跑出上次最後一個畫面

     

    這樣的話 是不是那些記憶體都被慢慢的吃掉   還是只有最後一張圖檔佔了記憶體位置 

    或是 有什麼方法可以測試得知呢??


     

    2008年1月31日 下午 02:46