C# - 使用SearchOption搜索目录中的匹配文件名

时间:2011-03-23 19:32:28

标签: c# winforms search process

背景:我正在使用带有OpenFileDialog&的C#开发WinForms应用程序。 FileBrowserDialog将1)搜索指定源目录的文件名中的特定字符串2)将文件复制到合并目录3)将多个文件从excel转换为csv文件,然后3)将所有生成的csv文件转换为1个大csv使用命令行可执行文件

的文件

示例:MSDN提供了一个代码示例,列出了“c:\”中以字母“c”开头的所有目录和文件。在http://msdn.microsoft.com/en-us/library/ms143448.aspx所以我的代码就是基于......

问题:代码不会将任何文件复制到统一文件夹,所以我很确定搜索不起作用。

我应该在这里改变什么?它不起作用:

    string files = "*.xlsx";
    void DirSearch(string sDir)
    {
        try
        {
            foreach (string d in Directory.GetDirectories(sDir))
            {
                foreach (string f in Directory.GetFiles(d, files))
                {
                    // Is this the file we are looking for?
                    // check excel files for corp name in the filename.
                    if (f.Contains(m_sc.get_Corp()))
                    {
                        // check if thread is cancelled
                        if (m_EventStop.WaitOne(0, true))
                        {
                            // clean-up operations may be placed here
                            // ...

                            // inform main thread that this thread stopped
                            m_EventStopped.Set();

                            return;
                        }
                        else
                        {
                            string path = sDir;
                            string searchPattern = m_sc.get_Corp();

                            // A file has been found in this directory
                            DirectoryInfo di = new DirectoryInfo(path);
                            DirectoryInfo[] directories = di.GetDirectories(searchPattern, SearchOption.TopDirectoryOnly);

                            foreach (FileInfo file in files)
                            {

                              try
                              {
                              // Copy each selected xlsx files into the specified TargetFolder 

                              System.IO.File.Copy(FileName, consolidatedFolder + @"\" + System.IO.Path.GetFileName(FileName));
                              Log("File" + FileName + " has been copied to " + consolidatedFolder + @"\" + System.IO.Path.GetFileName(sourceFileOpenFileDialog.FileName));

                             // Convert each selected XLSX File to CSV Using the command prompt code... 
                              }
                            }
                       }
                  }

2 个答案:

答案 0 :(得分:4)

您发布的代码有两个独立的搜索循环:

第一

    foreach (string d in Directory.GetDirectories(sDir))
    {
        foreach (string f in Directory.GetFiles(d, files))
        {
            // Is this the file we are looking for?
            // check excel files for corp name in the filename.
            if (f.Contains(m_sc.get_Corp()))
            {

然后在其中它也会:                             string path = sDir;                             string searchPattern = m_sc.get_Corp();

                        // A file has been found in this directory
                        DirectoryInfo di = new DirectoryInfo(path);
                        DirectoryInfo[] directories = di.GetDirectories(searchPattern, SearchOption.TopDirectoryOnly);

                        foreach (FileInfo file in files)
                        {

在第一个文件中,您正在查找匹配m_sc.get_Corp();的文件,在第二个文件中您正在查找目录...

实际上......你的代码(伪代码?)毫无意义......

尝试:

  • 慢慢来。
  • 自己整理代码
  • 如果你慢慢地重写它并把它分成更小的块,你可能会发现你做错了什么。

答案 1 :(得分:1)

尝试清理一下,下面是一些会让你走上路径的代码,我已经排除了CSV转换和合并,希望你能得到这个想法。

  private void YourFileRoutine(string sourceDirectoryPath, string consolidatedDirectoryPath)
    {
        var excelFiles = new DirectoryInfo(sourceDirectoryPath).GetFiles().Where(x => x.Extension == ".xlsx");

        //Copy all Excel Files to consolidated Directory
        foreach (var excelFile in excelFiles)
        {
            FileInfo copiedFile = excelFile.CopyTo(String.Concat(consolidatedDirectoryPath, excelFile.Name)); // Make sure consolidatedDirectoryPath as a "\" maybe use Path.Combine()?

            // ConvertToCSV( Do your CSV conversion here, the Path will be = Path.GetFullPath(copiedFile);
        }

        // Merge CSV's
        var csvFiles = new DirectoryInfo(consolidatedDirectoryPath).GetFiles().Where(x => x.Extension == ".csv");
        // SomeMergeMethod that iterates through this FileInfo collection?

    }