在 C# 中删除然后移动文件的代码不起作用
本文关键字:文件 代码 不起作用 移动 然后 删除 | 更新日期: 2023-09-27 18:36:38
我有一个用 C# 编写的"恢复"程序,它曾经需要查找四种特定类型的文件,将任何这些类型的文件移动到一个目录(如果不存在,则首先创建该目录),然后将这些类型文件的所有实例移动到目录中,然后再从备份写入文件。 这是我的代码部分:
private void restoreFromBackup(string chosenFile)
{
this
.Cursor = Cursors.WaitCursor;
// Create new directory in which to move existing .bin and .hid files on the PC
if (!Directory.Exists("C:''Phoenix''OldBinHid"))
{
Directory.CreateDirectory("C:''Phoenix''OldBinHid");
}
else
{
Array.ForEach(Directory.GetFiles(@"C:''Phoenix''OldBinHid"), File.Delete);
}
// Move existing .bin and .hid files to the new directory
string pattern = @"('.bin|'.hid|'.BIN|.HID)$";
var files = Directory.GetFiles(@"C:'Phoenix")
.Where(x => Regex.IsMatch(x, pattern))
.Select(x => x).ToList();
foreach (var item in files)
{
Console.WriteLine(item);
string name = item.Substring(item.LastIndexOf("''") + 1);
File.Move(item, Path.Combine(@"C:'Phoenix'OldBinHid", name));
}
创建目录工作得很好,但是即使我在 C:''Phoenix 目录中放置了每种文件类型(Test.bin、Test.BIN、Test.hid 和 Test.HID)的一个示例,它们都没有移动到 C:''Phoenix''OldBinHid 目录中。 然后,我还将simlar测试文件的副本放在C:''Phoenix''OldBinHid目录中,并运行了第二次还原 - 它也没有删除该目录中的任何文件。
我在这里有什么问题?
任何帮助将不胜感激。
谢谢
嗯 - 它仍然没有做我想让它做的事情。 还原将适用于我们的一个异地位置收到一台新 PC,该 PC 将自动加载默认.bin和 .hid 文件。 但是我们的异地位置很可能在他们以前的PC上建立了许多不同的.bin和.hid文件,这些文件应该在前一天晚上通过将某些文件压缩到另一台PC上备份,包括他们所有的.bin和.hid文件。 我需要做的是让还原程序检查 C:''Phoenix''OldBinHid 目录是否已存在(从技术上讲不应该,但有时如果新 PC 有其他问题,他们必须将旧 PC 放回原位)如果确实存在,请删除其中的所有文件。 如果它不存在,它应该创建 C:''Phoenix''OldBinHid 目录,然后在父 (C:''Phoenix) 目录中搜索所有 .bin 和 .hid 文件,并将它们移动到 ''OldBinHid 目录中,以便在还原解压缩备份时,它会将其最新的备份.bin和 .hid 文件放回原位。
昨晚,我在我的''Phoenix目录中放置了几个测试文件(TestA.bin,TestB.BIN,TestC.hid,TestD.HID),以便备份它们。 我在OldBinHid目录中也有一些测试文件。 然后,我首先尝试了您对我在还原程序中的内容的一些更正,西蒙。 不起作用 - 程序运行,但从 ''OldBinHid 目录中没有删除任何内容,并且我的测试文件都没有移动到那里。 然后,我又输入了几个测试文件,因此我知道我的 ''Phoenix 目录中会有额外的测试文件,并再次运行我的还原。 仍然没有任何东西移动到目录中,原始测试文件仍在''OldBinHid目录中。 所以我选择了你的更干净的版本 - 这是我所拥有的:
// Create new directory in which to move existing .bin and .hid files on the PC
string sourceDirectory = @"C:'Phoenix";
string destinationDirectory = @"C:'Phoenix'OldBinHid";
string pattern = @"('.bin|'.hid)$";
Directory.CreateDirectory(destinationDirectory);
Array.ForEach(Directory.GetFiles(destinationDirectory), File.Delete);
// Move existing .bin and .hid files to the new directory
var files = Directory.GetFiles(sourceDirectory)
.Where(x => Regex.IsMatch(x, pattern, RegexOptions.IgnoreCase))
.Select(x => x)
.ToArray();
Array.ForEach(files, file =>
{
Console.WriteLine(file);
File.Move(file, Path.Combine(destinationDirectory, Path.GetFileName(file)));
});
并且仍然运行没有任何错误,但没有任何内容被删除或移动。 我在这里还缺少什么吗?
我刚刚敲了一个控制台应用程序并复制了您的代码。正如@Zong Zheng所说,如果你使用字符串文字,你需要删除双反斜杠。所以
@"C:'Phoenix'.."
而不是
@"C:''Phoenix''.."
这对我有用。这是我的代码(基于你的):
class Program
{
static void Main(string[] args)
{
restoreFromBackup("");
}
private static void restoreFromBackup(string chosenFile)
{
// Create new directory in which to move existing .bin and .hid files on the PC
if (!Directory.Exists(@"G:'temp'test2'test3"))
{
Directory.CreateDirectory(@"G:'temp'test2'test3");
}
else
{
Array.ForEach(Directory.GetFiles(@"G:'temp'test2'test3"), File.Delete);
}
// Move existing .bin and .hid files to the new directory
string pattern = @"('.bin|'.hid|'.BIN|.HID)$";
var files = Directory.GetFiles(@"G:'temp'test2")
.Where(x => Regex.IsMatch(x, pattern))
.Select(x => x).ToList();
foreach (var item in files)
{
Console.WriteLine(item);
string name = item.Substring(item.LastIndexOf("''") + 1);
File.Move(item, Path.Combine(@"G:'temp'test2'test3", name));
}
}
}
它表现出两种行为 - 如果目录存在,它会删除其中的任何内容。如果它不存在 - 它会创建它。
然后,它将基目录中的任何文件复制到子目录中。
但是,如果混合使用双反斜杠和字符串文字字符 @,它将停止工作。
另外,我肯定会更改此行:
string name = item.Substring(item.LastIndexOf("''") + 1);
自
string name = Path.GetFilename(item);
它更干净,更具可读性和免费性,因为它是内置的。
作为进一步的改进,我会考虑使用Regex.IsMatch方法的重载,并在RegexOptions参数中指定"IgnoreCase"。然后,您可以摆脱.BIN/.bin组合。这可能是您问题的根源(尽管我没有检查过) - 如果您文件夹中的文件是 Something.Bin 而不是 Something.bin 或 Something.BIN怎么办?忽略该案例将消除该问题。
这是相同代码的稍微干净的版本:
private static void restoreFromBackup(string chosenFile)
{
string sourceDirectory = @"G:'temp'test2";
string destinationDirectory = @"G:'temp'test2'test3";
string pattern = @"('.bin|'.hid)$";
// Create new directory in which to move existing .bin and .hid files on the PC
Directory.CreateDirectory(destinationDirectory);
Array.ForEach(Directory.GetFiles(destinationDirectory), File.Delete);
var files = Directory.GetFiles(sourceDirectory)
.Where(x => Regex.IsMatch(x, pattern, RegexOptions.IgnoreCase))
.Select(x => x)
.ToArray();
Array.ForEach(files, file =>
{
Console.WriteLine(file);
File.Move(file, Path.Combine(destinationDirectory, Path.GetFileName(file)));
});
}
希望这对你有帮助。
编辑
鉴于您的反馈(仍然不起作用),您需要对程序进行一些修改以进行一些详细的调试。
1.首先,拆分此行
Array.ForEach(Directory.GetFiles(destinationDirectory), File.Delete);
在两行中:
var filesToDelete = Directory.GetFiles(destinationDirectory);
Array.ForEach(filesToDelete, File.Delete);
在 var filesToDelete... 行之后放置一个断点,并在 filesToDelete 上添加一个监视。你看到了什么?文件删除变量中是否有任何文件名?
2. 在 foreach 上放置一个断点(文件中的变量项)
并在文件变量上添加监视。再说一遍,你看到了什么?
您需要开始分解它以查看它失败的地方。
在这个阶段,我的钱现在要么(缺乏)权限,要么不正确的路径/驱动器号/通配符。您确定您正在查看正确的文件夹吗?驱动器号?
事情往往不会做任何事情。它们要么有效,要么产生异常。"什么都没发生"的情况并不常见。除非你过滤掉东西,以便循环实际上不会循环。
清除 C# 调试技能并报告...
此外,请描述您正在运行的环境。文件是在本地物理驱动器上还是跨网络?什么版本的Windows?是.NET Windows还是MONO?您在什么机器上运行?文件大小?磁盘空间?等