首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用FileInfo类移动成对文件后,我需要一种优雅的方法来移动文件夹中的孤立文件

在使用FileInfo类移动成对文件后,我需要一种优雅的方法来移动文件夹中的孤立文件
EN

Stack Overflow用户
提问于 2011-03-23 07:34:11
回答 1查看 357关注 0票数 0

我有一个文件夹,我要从其中移动成对的相关文件(成对的xml和pdf)。可以随时将其他文件存放到此文件夹中,但该实用程序大约每10分钟运行一次。我们可以使用FileSystemWatcher类,但由于内部原因,我们不能使用此实用程序。

在每次运行期间,我使用System.IO.FileInfo类来读取文件夹中的所有文件(将只是xml和pdf)。将文件放入FileInfo对象后,我将遍历这些文件,将匹配项移动到一个工作文件夹中。完成此操作后,我希望将所有未配对但位于FileInfo对象中的文件移动到失败文件夹中。

既然我似乎不能从FileInfo对象中删除条目(或者我遗漏了什么),那么(1)使用目录类.GetFiles中的字符串数组,(2)从FileInfo对象中创建一个Dictionary并在迭代期间删除其中的值,或者(3)是否有更好的方法使用LINQ或其他方法?

以下是到目前为止的代码:

代码语言:javascript
复制
internal static bool CompareXMLandPDFFileNames(FileInfo[] xmlFiles, FileInfo[] pdfFiles, string xmlFilePath)
    {
        string workingFilePath = xmlFilePath + @"\WORKING";            

        if (xmlFiles.Length > 0)
        {
            foreach (var xmlFile in xmlFiles)
            {
                string xfn = xmlFile.Name; //xml file name
                string pdfName = xfn.Substring(0,xfn.IndexOf('_')) + ".pdf"; //parsed pdf file name contained in xml file name

                foreach (var pdfFile in pdfFiles)
                {
                    string pfn = pdfFile.Name; //pdf file name
                    if (pfn == pdfName)
                    {
                        //move xml and pdf files to working folder...
                        FileInfo xmlInfo = new FileInfo(xmlFilePath + xfn);
                        FileInfo pdfInfo = new FileInfo(xmlFilePath + pfn);
                        if (!File.Exists(workingFilePath + xfn))
                        {
                            xmlInfo.MoveTo(workingFilePath + xfn);                                
                        }

                        if (!File.Exists(workingFilePath + pfn))
                        {
                            pdfInfo.MoveTo(workingFilePath + pfn);
                        }                            
                    }
                }
            }

            //all files in the file objects should now be moved to working folder, if not, fix orphans...
        }

        return true;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-23 10:05:57

老实说,我认为这个问题有点糟糕。这个问题是以一种非常复杂的方式陈述的。我认为工作流程应该设计得更健壮,更具确定性。(例如,为什么不首先在压缩集中上传文件对?)

(而且没有“某人”最有可能“以前肯定没有来过这里”)

以下是一些随机的改进:

代码语言:javascript
复制
using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;

namespace O
{
    static class X
    {
        private static readonly Regex _xml2pdf = new Regex("(_.*).xml$", RegexOptions.Compiled | RegexOptions.IgnoreCase);

        internal static void MoveFileGroups(string uploadFolder)
        {
            string workingFilePath = Path.Combine(uploadFolder, "PROGRESS");

            var groups = new DirectoryInfo(uploadFolder)
                .GetFiles()
                .GroupBy(fi => _xml2pdf.Replace(fi.Name, ".pdf"), StringComparer.InvariantCultureIgnoreCase)
                .Where(group => group.Count() >1);

            foreach (var group in groups)
            {
                if (!group.Any(fi => File.Exists(Path.Combine(workingFilePath, fi.Name))))
                    foreach (var file in group)
                        file.MoveTo(Path.Combine(workingFilePath, file.Name));
            }
        }

        public static void Main(string[]args)
        {
        }
    }
}

  1. 使用可读的名称(说你的意思)如果文件名不包含“_”,
  2. IndexOf返回-1;随机上载文件名可能导致过程失败
  3. 处理文件名不区分大小写在many
  4. 上不要手动做路径连接(您可能意外地制造UNC路径,并且您的代码较少假设一个xml将映射到一个pdf:命名方案意味着许多xml映射到相同的pdf名称。此实现允许(或者您可以仅通过原子拒绝groups.Where(g => g.Count()>2)
  5. Move组来检测这种情况(!):如果组中的任何一个文件存在于目标目录中,则不要移动任何文件(否则将出现竞争条件,其中组的一部分在最后一个文件(完全)上载之前被移动,并且永远不会被移动,因为

不再检测到该组

其他项目(待办事项)

  • 不传递冗余参数。如果您想要进行filtering.
  • Do错误处理,您可能会传递一个FI[]而不是原始的GetFiles()调用,特别要注意的是:在上传过程中,
    • handle IO exceptions
    • locking错误是可预期的(测试它或以损坏的文件结束);您需要自动处理这些错误(即,除非所有文件都可以移动,否则不要移动组中的任何文件;这将有点棘手)
      • 测试您的代码(我的任何示例都没有经过测试;它只是在带有mono)

的linux上编译的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5399171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档