使用相同的前3个字母对文件进行排序,而不是删除旧文件?

时间:2010-06-22 18:08:54

标签: c#

我上个星期有一个问题,你很快就减轻了任何可以阻止我的担忧,希望你再次帮助初学者计划!

我正在尝试自动执行我日常的一项平凡任务,而且我认为这主要是因为我没有采取正确的方法。

每天早上我都会浏览一个系统目录,其中包含许多具有相同前缀的文件,以及一个生成后的数字。我必须先按字母顺序排序,然后删除该文件的最旧版本。

以下是我的目录的示例图片:http://i.imgur.com/5l2Am.png

我打算通过按名称排序文件并将前3个字母与下一个文件进行比较来解决这种情况,如果它们相同,我会删除(或移动到备份文件夹)第二个文件,直到它们为止不再匹配,我会转到下一个前缀作为比较器。

虽然我发现这个问题,但是它们并不总是正确排序,我冒着删除错误文件的风险。

有没有人有这种性质的经验?在我的头脑和VS中,我可以将所有部分放在那里,但似乎无法将它们连接在一起,主要是因为我以前从未冒险进入system.IO课程,但我想学习!

任何建议都表示赞赏,如果你想看到我徒劳的尝试,我很乐意与你分享:P。

谢谢, 尼克

3 个答案:

答案 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();

从那里,您可以按filesCreationTime或其他方式对Name进行排序。要删除一个,只需在FileInfo类上使用Delete方法。