我有一个Listbox
,可以使用特定的扩展文件。如果我选择其他格式,我的应用程序会自动将文件转换为同一文件夹中的正确格式(另一个扩展名),并将具有错误扩展名的所有文件添加到List
(listToRemove
)并删除它们在我清理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);
}
答案 0 :(得分:0)
看起来它与您使用线程的方式有关:您正在删除尚未转换的文件。
File.Delete(file);
必须在您进行转换的线程中执行(即sendFilesToConvertToAvi
)
这是你通常会做的,假设这是UI应用程序:
希望这有帮助。
这是我写的一些代码。它运作良好。 (您可能想要添加进度条:))。
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的回调。即转换后。