Нужна помощь, изменив этот код - PullRequest
1 голос
/ 22 апреля 2009

Я хочу удалить все файлы с расширением .rar из всех каталогов с определенным диском. Скажем, у меня есть «D: \ Test» под этим, я создал много файлов .rar или .zip. После запуска программы следует удалить только все файлы .rar, а другие файлы расширений должны остаться такими же, и на нем должно отображаться, сколько файлов rar не было удалено. Я могу создать n файлов в подкаталоге, но пока программа запускается, все .rar файлы должны быть удалены. Для этого я написал программу и создал много файлов на этом конкретном диске, но когда я запускаю приложение, говоря, что нет файлов, я имею в виду, что он всегда проверяет условие else. Вот мой код, пожалуйста, кто-нибудь изменить его.

static void Main(string[] args)
{
    DirectoryInfo dirMain = new DirectoryInfo("D:\\Test");
    if (dirMain != null)
    {
        FileInfo[] dirRar = dirMain.GetFiles("*.rar", SearchOption.AllDirectories);
        if (dirRar != null && dirRar.Length > 0)
        {
            for (int i = 0; i < dirRar.Length; i++)
            {
                Console.WriteLine(dirRar[i].FullName);
                dirRar[i].Delete();
            }
            Console.WriteLine("Total no of files deleted" + dirRar.Length.ToString());
        }
        else
        {
            Console.WriteLine("There is no file");
        }
    }
    Console.ReadKey();
}

Ответы [ 4 ]

1 голос
/ 22 апреля 2009

отлично работает для меня; может быть, проверить, что d:\Test существует? Кроме того, обратите внимание, что рекурсивная перегрузка GetFiles немного ненадежна, когда она попадает в сложные наборы разрешений. Вы бы лучше справились, выполнив рекурсию вручную, используя try / catch вокруг подпапок:

int count = 0;
Queue<string> dirs = new Queue<string>();
dirs.Enqueue(@"d:\Test");
while(dirs.Count > 0) {
    string dir = dirs.Dequeue();
    try
    {
        foreach (string subdir in Directory.GetDirectories(dir))
        {
            dirs.Enqueue(subdir);
        }
    }
    catch (Exception ex) { Console.Error.WriteLine(ex); }// access denied etc

    foreach (string file in Directory.GetFiles(dir, "*.rar"))
    {
        try
        {
            File.Delete(file);
            count++;
        }
        catch (Exception ex) { Console.Error.WriteLine(ex); }// access denied etc
    }
}
Console.WriteLine("Deleted: " + count);
0 голосов
/ 22 апреля 2009

Несколько предложений:

  1. Убедитесь, что файлы или каталог не помечены как скрытые.
  2. Попробуйте FileInfo[] dirRar = dirMain.GetFiles("*.*"); Выполните итерацию для каждого файла и проверьте, получаете ли вы RAR-файл
0 голосов
/ 22 апреля 2009

Здесь работает.

Все rar-файлы в D: \ Test были удалены.

0 голосов
/ 22 апреля 2009

Ваш код выглядит нормально. Если вы вводите условие else, это означает, что в каталоге d: \ test (или в каких-либо вложенных папках) отсутствуют файлы .rar или что учетная запись, под которой выполняется код, не имеет разрешений на чтение этой папки.

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