C # - Поиск подходящих имен файлов в каталоге, используя SearchOption - PullRequest
0 голосов
/ 23 марта 2011

Справочная информация: я разрабатываю приложение WinForms с использованием C # с OpenFileDialog & FileBrowserDialog, которое будет 1) искать определенную строку в именах файлов указанного исходного каталога 2) копировать файлы в консолидированный каталог 3) преобразовывать несколько файлов из Excelв CSV-файлы, а затем 3) преобразовать все сгенерированные CSV-файлы в 1 большой CSV-файл, используя исполняемый файл командной строки

Пример: MSDN предоставляет пример кода, в котором перечислены все каталоги и файлы, начинающиеся с буквы«с» в «с: \».на 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 ]

4 голосов
/ 23 марта 2011

Код, который вы разместили, выполняет два отдельных цикла поиска:

сначала:

    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 голос
/ 23 марта 2011

Попробуйте немного почистить, ниже приведен код, который укажет вам путь, я исключил преобразование 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?

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...