Проигнорируйте папки/файлы когда Каталог. GetFiles () запрещен доступа

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

71
задан abatishchev 3 September 2013 в 06:09
поделиться

3 ответа

Необходимо будет сделать рекурсию вручную; не используйте AllDirectories - смотрят одна папка за один раз, затем пытаются получить файлы от Непротестированных поддиректоров, но что-то как ниже (отметьте, использует делегата вместо того, чтобы создать массив):

using System;
using System.IO;
static class Program
{
    static void Main()
    {
        string path = ""; // TODO
        ApplyAllFiles(path, ProcessFile);
    }
    static void ProcessFile(string path) {/* ... */}
    static void ApplyAllFiles(string folder, Action<string> fileAction)
    {
        foreach (string file in Directory.GetFiles(folder))
        {
            fileAction(file);
        }
        foreach (string subDir in Directory.GetDirectories(folder))
        {
            try
            {
                ApplyAllFiles(subDir, fileAction);
            }
            catch
            {
                // swallow, log, whatever
            }
        }
    }
}
48
ответ дан Marc Gravell 24 November 2019 в 13:08
поделиться

Это должно ответить на вопрос. Я проигнорировал проблему прохождения через подкаталогов, я предполагаю, что Вам выяснили это.

, Конечно, у Вас не должно быть отдельного метода для этого, но Вы могли бы найти его полезным местом, чтобы также проверить, что путь допустим, и соглашение за другими исключениями, с которыми Вы могли встретиться при вызове GetFiles ().

Hope это помогает.

private string[] GetFiles(string path)
{
    string[] files = null;
    try
    {
       files = Directory.GetFiles(path);
    }
    catch (UnauthorizedAccessException)
    {
       // might be nice to log this, or something ...
    }

    return files;
}

private void Processor(string path, bool recursive)
{
    // leaving the recursive directory navigation out.
    string[] files = this.GetFiles(path);
    if (null != files)
    {
        foreach (string file in files)
        {
           this.Process(file);
        }
    }
    else
    {
       // again, might want to do something when you can't access the path?
    }
}
2
ответ дан user25306 24 November 2019 в 13:08
поделиться
6
ответ дан 24 November 2019 в 13:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: