2013-12-20 4 views
1

Я пытаюсь переместить текстовые файлы в папку, но игнорировать test.txt, а все остальные будут перемещены в папку FileHolder. Когда я его запускаю, он все равно перемещает все файлы txt в папку.Переместить файлы в папку, но игнорировать некоторые из них

private void testmodule() 
{ 
    string filepath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
    DirectoryInfo d = new DirectoryInfo(filepath); 

    List<String> AllDeskTopFiles = Directory.GetFiles(filepath, "*.txt*").ToList(); 

    foreach (string file in AllDeskTopFiles) 
    { 
     if (file != "test.txt") 
     { 
      FileInfo mFile = new FileInfo(file); 
      if (new FileInfo(d + "\\FileHolder\\" + mFile.Name).Exists == false) 
       mFile.MoveTo(d + "\\FileHolder\\" + mFile.Name); 
     } 
    } 
} 
+0

Вот подсказка, посмотрите фактические значения в 'файле', и ваш ответ должен быть довольно очевиден. –

+0

Psst, используйте Path.Combine, это упростит вашу жизнь. – Moeri

ответ

1

Необходимо отфильтровать на основе имени файла, а не полного пути.

Вы можете просто сделать фильтр в операторе LINQ:

var allDeskTopFiles = Directory 
      .GetFiles(filepath, "*.txt*") 
      .Where(f => !f.EndsWith("test.txt", StringComparison.InvariantCultureIgnoreCase); 


foreach (string file in allDeskTopFiles) 
{ 
    // Move all files now 
1

Directory.GetFiles возвращает имена файлов (в том числе их пути) в указанном каталоге.

Так что вам нужно применить метод для извлечения только имя файла

foreach (string file in AllDeskTopFiles) 
    { 
     if (Path.GetFileName(file).ToLower() != "test.txt") 
     { 
      FileInfo mFile = new FileInfo(file); 
      if (new FileInfo(d + "\\FileHolder\\" + mFile.Name).Exists == false) 
       mFile.MoveTo(d + "\\FileHolder\\" + mFile.Name); 
     } 
    } 

также создавая FileInfo для каждого цикла просто чтобы проверить наличие или отсутствие файла кажется немного дорогой

string destPath = Path.Combine(filepath, "FileHolder"); 
    foreach (string file in AllDeskTopFiles) 
    { 
     string fileToMove = Path.GetFileName(file).ToLower(); 
     if (fileToMove != "test.txt") 
     { 
      string destFile = Path.Combine(destPath, fileToMove); 
      if (!File.Exists(destFile)) 
       File.Move(file, destFile); 
     } 
    } 
+1

Существует typo, Path.GetFileName (file =). ToLower() – Adil

+0

Да, кто-то уже исправил его – Steve

+0

Хорошо, спасибо за помощь – user2184248

2

Ваша переменная file содержит полный путь.

0

После следует исправить, уборщик способ в настоящее время:

private void testmodule() 
{ 
    string filepath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
    DirectoryInfo d = new DirectoryInfo(filepath); 

    List<String> AllDeskTopFiles = Directory.GetFiles(filepath, "*.txt*").ToList(); 

    foreach (string file in AllDeskTopFiles) 
    { 
     //if (file.ToLower().EndsWith("test.txt")) 
     //{ 
     // FileInfo mFile = new FileInfo(file); 
     // if (new FileInfo(d + "\\FileHolder\\" + mFile.Name).Exists == false) 
     //  mFile.MoveTo(d + "\\FileHolder\\" + mFile.Name); 
     //} 
     FileInfo mFile = new FileInfo(file); 
     if(mFile.Name.ToLower() != "test.txt") 
     { 
      if (new FileInfo(d + "\\FileHolder\\" + mFile.Name).Exists == false) 
       mFile.MoveTo(d + "\\FileHolder\\" + mFile.Name); 
     } 
    } 
} 
0

Вы можете проверить имя файла, например:

  DirectoryInfo dirInfo = new DirectoryInfo("old"); 

     foreach (FileInfo fi in dirInfo.GetFiles("*.txt")) 
     { 
      if (fi.Name != "test.txt") 
       File.Copy(fi.FullName, "new/" + fi.Name); 
     } 

Или изменить код, чтобы проверить if !file.Contains("text.txt") вместо if file != "test.txt

Смежные вопросы