Lefteris Gkinis Ответов: 2

Доступ в папку запрещен


Я ищу файл в своем компьютере.
Используя этот способ

For Each foundFile As String In My.Computer.FileSystem.GetFiles(
	My.Computer.FileSystem.SpecialDirectories.MyDocuments,
        Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, 
        UploadControl.FileName)
	fullPath.Add(foundFile)
    Next


Но в некоторых подкаталогах доступ не позволяет выдавать ошибку "доступ запрещен"

Я не хочу управлять ошибкой, но перейти к следующему подкаталогу.

Как я могу это сделать ?

Что я уже пробовал:

Будьте очень осторожны здесь
Я хочу вот чего: когда возникает проблема, код должен покинуть ее и попасть в другой каталог.

2 Ответов

Рейтинг:
6

OriginalGriff

Чтобы добавить к тому, что говорит Дэйв, в ваших документах есть папки, которые поддерживает система: в основном они связаны с корзиной.
Если вы проверяете их, вы можете уменьшить количество исключений, что сэкономит время (значительное время, если ваша папка документов имеет много подкаталогов).
Это может помочь:

private long SizeDirFolders(string dir, DirNode node)
    {
    if (!IsIgnorable(dir))
        {
        if (dir.EndsWith(":")) dir += "\\";
        foreach (string path in Directory.GetDirectories(dir))
            {
            try
                {
                int last = path.LastIndexOf('\\');
                if (last < 0)
                    {
                    last = 0;
                    }
                string sname = path.Substring(last);
                if (!IsIgnorable(sname))
                    {
                    DirNode dn = new DirNode(sname, 0);
                    lock (Root)
                        {
                        node.Add(dn);
                        }
                    SizeDir(path, dn);
                    }
                }
            catch (UnauthorizedAccessException) { } //Discard
            catch (Exception ex)
                {
                DialogResult result =  MessageBox.Show("An error occurred: " + ex.Message + "\nResults for the " + dir + "will not be complete", "Error!", MessageBoxButtons.OKCancel);
                if (result == DialogResult.Cancel) return node.Size;
                }
            }
        }
    return node.Size;
    }

private bool IsIgnorable(string dir)
    {
    if (dir.EndsWith(":System Volume Information")) return true;
    if (dir.Contains(":$RECYCLE.BIN")) return true;
    return false;
    }

private void SizeDir(string dir, DirNode node)
    {
    if (!IsIgnorable(dir))
        {
        DirNode dn = SizeDirFiles(dir);
        lock (Root)
            {
            node.Add(dn);
            }
        SizeDirFolders(dir, node);
        }
    }


Lefteris Gkinis

Да, я понимаю, но в вашем коде есть что-то такое, чего я не могу понять.
Проблема заключается в `SizeDirFiles(dir)`, который, вероятно, является некоторой функцией, которая не объявлена.
Можете ли вы помочь в этом ?
Видите ли, я все это превращаю в vb.net и есть повешение.

Lefteris Gkinis

Кроме того, я не могу понять, как работает этот класс. Как отправить файл и вернуть путь к подкаталогу

Lefteris Gkinis

Ваша колосниковая решетка... Да, я нашел свое решение... большое спасибо обе ваши решетки спасибо

OriginalGriff

Всегда пожалуйста!

Рейтинг:
19

Dave Kreskowiak

Вы должны сами перечислить каталоги и файлы. Вы не сможете использовать для этого ярлык My.Computer.

Видеть Каталог.GetDirectories[^] и Каталог.Заражен[^].

У вас будет два цикла: внешний цикл каталогов и внутренний цикл файлов. Оберните внутренний цикл файлов в блок try/catch, и вы сможете поймать исключение и все равно продолжить работу со следующим каталогом.


Lefteris Gkinis

Ваша колосниковая решетка... Да, я нашел свое решение... Большое спасибо