我上个星期有一个问题,你很快就减轻了任何可以阻止我的担忧,希望你再次帮助初学者计划!
我正在尝试自动执行我日常的一项平凡任务,而且我认为这主要是因为我没有采取正确的方法。
每天早上我都会浏览一个系统目录,其中包含许多具有相同前缀的文件,以及一个生成后的数字。我必须先按字母顺序排序,然后删除该文件的最旧版本。
以下是我的目录的示例图片:http://i.imgur.com/5l2Am.png
我打算通过按名称排序文件并将前3个字母与下一个文件进行比较来解决这种情况,如果它们相同,我会删除(或移动到备份文件夹)第二个文件,直到它们为止不再匹配,我会转到下一个前缀作为比较器。
虽然我发现这个问题,但是它们并不总是正确排序,我冒着删除错误文件的风险。
有没有人有这种性质的经验?在我的头脑和VS中,我可以将所有部分放在那里,但似乎无法将它们连接在一起,主要是因为我以前从未冒险进入system.IO课程,但我想学习!
任何建议都表示赞赏,如果你想看到我徒劳的尝试,我很乐意与你分享:P。
谢谢, 尼克
答案 0 :(得分:3)
您应该可以使用Directory.GetFiles来检索文件名。我怀疑你的排序问题可能是由于套管 - 在C#中,字符串排序,默认情况下,区分大小写,但文件系统不是。
我建议在处理之前加载文件列表,然后自己在C#中对它们进行排序:
List<string> files = Directory.GetFiles(myDirectory)
.Select(file => file.ToLower()) // To lower case
.OrderBy(file => file) // Sort the files
.ToList();
// Process the files here...
答案 1 :(得分:1)
创建一个由三个字符前缀索引的字典。
当您到达文件时,请检查字典中的值:
如果不存在,请保留文件并将其添加到字典中,其中键是前缀,值是前缀后面的数字
如果存在,但具有较旧的“数字”值,请将旧版本存档,保留较新版本并更新字典以获取新编号
如果存在,但有一个较新的“数字”值,请将旧的存档,保留较新的一个,此时字典已经是最新的。
无需排序。
编辑:添加示例:
public static void ProcessDirectory(string directoryPath)
{
IDictionary<string,string> prefixDictionary = new Dictionary<string, string>();
if (Directory.Exists(directoryPath))
{
foreach(string filePath in Directory.GetFiles(directoryPath))
{
string fileName = Path.GetFileName(filePath);
string fileDirectory = Path.GetDirectoryName(filePath);
if (fileName.Length>=3)
{
string prefix = fileName.Substring(0, 3);
string rightPart = fileName.Substring(3, fileName.Length - 3);
if (!prefixDictionary.ContainsKey(prefix))
{
prefixDictionary[prefix] = rightPart;
}
else
{
string fileToArchive = null;
string storedRightPart = prefixDictionary[prefix];
// using string compare, but you could test file date or
// or parse the right part as a number if you only cared about
// files with numbers on the right.
if (String.Compare(storedRightPart,rightPart)<0)
{
prefixDictionary[prefix] = rightPart;
fileToArchive = Path.Combine(fileDirectory,prefix+storedRightPart);
}
else
{
fileToArchive = filePath;
}
if (fileToArchive != null)
{
// perform the archive here
}
}
}
}
}
}
答案 2 :(得分:0)
您将获得一个FileInfo对象数组,其中包含许多有关文件的元数据,可以让您对它们进行排序。它还允许您删除。
DirectoryInfo dir = new DirectoryInfo(@"C:/yourPath");
FileInfo[] files = dir.GetFiles();
从那里,您可以按files
或CreationTime
或其他方式对Name
进行排序。要删除一个,只需在FileInfo类上使用Delete
方法。