Итерировать файловую систему, начиная с корневого каталога C: \? - PullRequest
1 голос
/ 30 января 2012

Я очень близок к завершению этого проекта, но у меня есть проблема, которую я не могу решить.Если я запустил свою программу и запустил итерацию, например, в Мои документы.Все работает отлично.Программа выполняет итерации, записывает результаты в CSV-файл, как сказать.Однако, если я начну итерацию с C: \ (вы увидите ниже, что я написал, чтобы «перехватить» исключение UnauthorizedAccessException), всплывающие сообщения, которые я закодировал, говорят мне, что у меня нет разрешения на доступ к какой-либокаталоги, и он даже не создает CSV-файл.Вот мой код, любая помощь будет отличной.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;



namespace FileIterator
{
class Iterator
{
    public class MyItem
    {
        public static string it { get; set; }
    }

    public class Record
    {
        public long fileSize { get; set; }
        public string fileName { get; set; }

    }

    static List<Record> fileList = new List<Record>();
    static string longest = " ";
    static string shortest = " ";

    public static void Iterate(string dir_tree)
    {
        Stack<string> dirs = new Stack<string>(20);

        if (!Directory.Exists(dir_tree))
        {
            MessageBox.Show("The directory you selected does not exist.", "Directory Selection Error",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
        dirs.Push(dir_tree);

        while (dirs.Count > 0)
        {
            string currentDir = dirs.Pop();
            string[] subDirs;
            try
            {
                subDirs = Directory.GetDirectories(currentDir);
            }

            catch (UnauthorizedAccessException)
            {
                MessageBox.Show("You do not have permission to access this folder " + currentDir, "Directory Permission Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                continue;
            }

            catch (DirectoryNotFoundException)
            {
                MessageBox.Show("The current directory does not exist", "Directory Not Found",
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                continue;
            }

            string[] files = null;

            try
            {
                files = System.IO.Directory.GetFiles(currentDir);
            }

            catch (UnauthorizedAccessException)
            {
                MessageBox.Show("You do not have permission to access this folder " + currentDir, "Directory Permission Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                continue;
            }

            catch (DirectoryNotFoundException)
            {
                MessageBox.Show("The current directory does not exist", "Directory Not Found",
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                continue;
            }



            foreach (string file in files)
            {
                try
                {
                    FileInfo fi = new FileInfo(file);
                    fileList.Add( new Record {
                        fileName = fi.Name,
                        fileSize = fi.Length
                    });
                }

                catch (FileNotFoundException)
                {
                    MessageBox.Show("The current file does not exist" + file, "File Not Found",
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    continue;
                }
            }

            foreach (string str in subDirs)
                dirs.Push(str);
        }


        using (var writer = new StreamWriter(@"C:\files.csv"))
        {
            writer.WriteLine("Name,Size"); // Header
            var query = fileList.OrderBy(r => r.fileName);
            foreach (Record record in query)
            {
                writer.WriteLine("\"{0}\",{1}", record.fileName, record.fileSize);
            }
        }

    }
}

}

1 Ответ

3 голосов
/ 30 января 2012

Если вы работаете в Windows 7 или Vista, у вас не будет разрешения на запись во многие каталоги без появления этого сообщения, предлагающего запустить приложение с правами администратора.

Чтобы узнать, является ли это вашей проблемой, запустите Visual Studio от имени администратора (щелкните правой кнопкой мыши VS в меню «Пуск» и выберите «Запуск от имени администратора»). Затем откройте ваш проект через Visual Studio и запустите его. Если он запускает и создает ваши CSV-файлы, то проблема заключается в отсутствии у вас повышенных разрешений. Если сообщение об ошибке все еще появляется, то вы знаете, что это что-то еще.

(хотя я бы рекомендовал не тестировать «все в C: \» - создайте каталог в программных файлах и используйте его в качестве своей песочницы для тестирования этой проблемы).

...