File.Delete也删除了错误的文件

时间:2012-03-23 21:21:22

标签: c#

我有一个Listbox,可以使用特定的扩展文件。如果我选择其他格式,我的应用程序会自动将文件转换为同一文件夹中的正确格式(另一个扩展名),并将具有错误扩展名的所有文件添加到ListlistToRemove)并删除它们在我清理Listbox之后,从我的List开始,但首先我要从我的计算机中删除所有这些文件,问题是我的应用程序也删除了具有正确扩展名的文件

for (int i = 0; i < listBoxFiles.Items.Count; i++)
{
    string path = (string)listBoxFiles.Items[i];
    FileInfo fileInfo = new FileInfo(path);

    if (fileInfo.Extension != ".avi")
    {
        listToRemove.Add(path);
    }
}

if (listToRemove.Count != 0)
{
    //method who convert the files to the new format and add the new files into my Listbox
    (new System.Threading.Thread(sendFilesToConvertToAvi)).Start(); 
}

foreach (string file in listToRemove) 
{
    File.Delete(file);
    listBoxFiles.Items.Remove(file);                  
}

public void sendFilesToConvertToAvi()
{
    if (listToRemove.Count == 0)
    {
        return;
    }

    foreach (String file in listToRemove)
    {
        FileInfo fileInfo = new FileInfo(file);

        myClassWhoConvertTheFiles = new myClassWhoConvertTheFiles (fileInfo);

        this.Invoke((MethodInvoker)delegate
        {
            listBoxFiles.Items.Add(myClassWhoConvertTheFiles ._newFileName);
        });

        count++;
    }

    listToRemove.RemoveRange(0, listToRemove.Count);
}

2 个答案:

答案 0 :(得分:0)

看起来它与您使用线程的方式有关:您正在删除尚未转换的文件。

File.Delete(file);必须在您进行转换的线程中执行(即sendFilesToConvertToAvi

这是你通常会做的,假设这是UI应用程序:

  1. 按下按钮,使用BackgroundWorker启动另一个线程。
  2. 在相同的代码部分中,通过删除要转换的文件来更新ListBox。您可能希望在此处禁用ListBox。
  3. 向您的应用添加进度条,以便了解转化的方式。
  4. 在回调中,作业完成后,删除不需要的文件。您可能希望再次启用ListBox。
  5. 希望这有帮助。

    这是我写的一些代码。它运作良好。 (您可能想要添加进度条:))。

        private List<string> listToRemove = new List<string>();
    
        public Form1()
        {
            InitializeComponent();
            listBoxFiles.Items.Add("1.avi");
            listBoxFiles.Items.Add("2.avi");
            listBoxFiles.Items.Add("3.wrong");
            backgroundWorker1.DoWork += backgroundWorker1_DoWork;
            backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
        }
    
        void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            foreach (var file in listToRemove)
            {
                // Imitate hard conversion
                Thread.Sleep(5000);
                var newFileName = Path.ChangeExtension(file, "avi");
                // save NEW file to file system here...
    
                // delete old file from file system
                File.Delete(file);
            }
        }
    
        void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            foreach (var file in listToRemove)
            {
                var newFileName = Path.ChangeExtension(file, "avi");
                listBoxFiles.Items.Add(newFileName);
            }
            listBoxFiles.Enabled = true;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            listToRemove = new List<string>();
    
            for (int i = 0; i < listBoxFiles.Items.Count; i++)
            {
                string path = (string)listBoxFiles.Items[i];
                FileInfo fileInfo = new FileInfo(path);
    
                if (fileInfo.Extension != ".avi")
                {
                    listToRemove.Add(path);
                    listBoxFiles.Items.Remove(path);
                }
            }
    
            listBoxFiles.Enabled = false;
            if (backgroundWorker1.IsBusy != true)
            {
                // Start the asynchronous operation.
                backgroundWorker1.RunWorkerAsync(listToRemove);
            }
        }
    }
    

答案 1 :(得分:0)

问题最有可能发生在:

sendFilesToConvertToAvi

您未显示的代码。这样:

    File.Delete(file);
    listBoxFiles.Items.Remove(file);                  

看起来应该是来自sendFilesToConvertToAvi的回调。即转换后。