System.UnauthorizedAccessException al obtener archivos

He hecho una pregunta muy similar antes de aquí . Pero eso se trataba de obtener directorios, y esto se trata de archivos. Y estos códigos son un poco diferentes el uno del otro. Desde que intenté convertir esto para que parezca answer en mi pregunta anterior, no he sido capaz de hacerlo funcionar

string[] files = Directory.GetFiles(ScanPath, "*.*", System.IO.SearchOption.AllDirectories);
DateTime From = DateTime.Now.AddHours(-24);
DateTime To = DateTime.Now;

foreach (string name in files)
{
   FileInfo file = new FileInfo(name);
   string fullname = file.FullName;

   if (file.LastWriteTime >= From & file.LastWriteTime <= To && file.Length >= ScanSize)
      Console.WriteLine(file.FullName + " ; " + "last changed at  " + " ; " + file.LastWriteTime.ToString());
}

He estado recibiendo los mismos errores que expliqué en la otra pregunta. Porque no sé dónde colocar el código del foreach en una recursión. Ya que no es una enumeración sino un Directory.GetFiles() .

El error ocurre con:

Directory.GetFiles (ScanPath, "*", SearchOption.AllDirectories);

porque esto obtiene todos los archivos de los directorios a la vez. Pero si lo elimino, solo obtiene los archivos en la ruta determinada, sin ninguno de los archivos en los subdirectorios. Entonces me dijeron que aplicara la recursión.

Soy el administrador del sistema y planeo ejecutar esto en toda la unidad de datos. RE:\

Espero que todos aquí conozcan un buen ejemplo.

0
si por favor menciona la línea donde está recibiendo la excepción. Gracias
agregado el autor Saghir A. Khatri, fuente
parece que no tienes suficientes permisos. como puede ver en msdn msdn.microsoft. com/en-us/library/ms143316% 28v = vs.110% 29.aspx
agregado el autor Saghir A. Khatri, fuente
Obtuve la excepción con el archivo creado por el sistema. de lo contrario, el código funciona bien
agregado el autor Saghir A. Khatri, fuente
intenté el mismo código que ha publicado. Obtuve una excepción solo cuando la línea intentó obtener el archivo creado originalmente por el sistema.
agregado el autor Saghir A. Khatri, fuente
Olvidé mencionar muchos detalles porque he explicado la mayor parte de la situación en la pregunta que he vinculado, lo siento. Añadiré algo de contexto.
agregado el autor user3095385, fuente
@SAK a través de la recursión? ¿Si no? Puedes decirme como lo hiciste?
agregado el autor user3095385, fuente
¿De qué camino estás tratando de obtener archivos? ¿Qué sistema operativo? ¿Has iniciado sesión como administrador? ¿Estás ejecutando VS como administrador?
agregado el autor Ondrej Janacek, fuente

2 Respuestas

Es posible que esté recibiendo "UnaauthorizedAccessException" al acceder a algunos de los directorios del sistema. La lista del directorio que causa los problemas son directorios que en realidad son solo redireccionamiento a otro directorio. Puede ser que puedas probar el siguiente código si ayuda-

try
{
    foreach (String file in Directory.GetFiles(directoryName, pattern, SearchOption.TopDirectoryOnly))
    {
      //do stuff
    }
catch (UnauthorizedAccessException uae)
{
           //handle
}
catch (Exception e) 
{ 
           //handle
}

Alternativa:

string[] directories = Directory.GetDirectories(ScanPath);

    foreach (string directory in directories)
    {
        string[] filesinCurrentDirectory = Directory.GetFiles(directory, "*.*", System.IO.SearchOption.AllDirectories);
        foreach (string file in filesinCurrentDirectory)
        {
            MessageBox.Show(file);
        }

    }
0
agregado
Ese es mi formato actual, pero necesito buscar recursivamente cada archivo accesible en cada directorio/subdirectorio de un directorio determinado.
agregado el autor user3095385, fuente
¿Puedes leer mi pregunta? Los errores ocurren cuando comienzo a escanear en las capas superiores de mi disco duro. Estoy hablando de los archivos ocultos que incluso el administrador no puede acceder. Entonces SearchOption.AllDirectories no funcionará.
agregado el autor user3095385, fuente
@ user3095385: ¿Podría ver la opción alternativa? Básicamente, cuando hago Directory.GetDirectories() obtengo todos mis directorios. entonces puedo llamar al método GetFiles() para obtener la lista de archivos en el directorio actual.
agregado el autor Ramashankar, fuente

Su aplicación no podría tener derechos de acceso a algunas carpetas, para otros puede usar el siguiente código:

void DiscoverDirs(string where, List files, Func filter)
{
    try
    {
        var di = new DirectoryInfo(where);
        files.AddRange(di.EnumerateFiles().Where(filter).Select(x => x.FullName));

        foreach (var dir in Directory.GetDirectories(where))
        {
            DiscoverDirs(dir, files, filter);
        }
    }
    catch
    {
       //no access fo this dir, ignore
    }
}

Uso:

DateTime From = DateTime.Now.AddHours(-24);
DateTime To = DateTime.Now;
var ScanSize = 5*1024*1024;

var list = new List();
DiscoverDirs(@"C:\", list, 
    file => file.LastWriteTime >= From & file.LastWriteTime <= To && file.Length >= ScanSize);

foreach (string name in list)
{
    FileInfo file = new FileInfo(name);
    string fullname = file.FullName;

    Console.WriteLine(file.FullName + " ; " + "last changed at  " + " ; " + file.LastWriteTime.ToString());
}
0
agregado
Tal como dije en mi pregunta, esperaba que se pareciera a esto .
agregado el autor user3095385, fuente
Oh sí, lo siento. Estoy acostumbrado a escanear directorios, los archivos son nuevos para mí. Muchas gracias por su ayuda y tiempo :)
agregado el autor user3095385, fuente
Parece estar funcionando. Pero la salida es incorrecta. Muestra que hay demasiados menos archivos (por ejemplo, si quiero archivos más o menos que 1 mb) en un directorio. Tengo 8 archivos de Photoshop de más de 50 mb, y el programa solo muestra 1. Sin embargo, el código parece ser correcto.
agregado el autor user3095385, fuente
Tengo el error: "Sin sobrecarga para el método 'DiscoverDirs' toma 2 argumentos" en DiscoverDirs (dir, archivos); en el foreach en el void DiscoverDirs . ¿Tuviste esto también?
agregado el autor user3095385, fuente
@ user3095385 Lo siento, lo arreglé.
agregado el autor Tony, fuente
@ user3095385 Ok, mira mi respuesta actualizada.
agregado el autor Tony, fuente
@ user3095385 Quizás estos archivos fueron filtrados por esta cláusula file.LastWriteTime> = From & file.LastWriteTime <= To ? Desea encontrar archivos, que se modificaron en las últimas 24 horas.
agregado el autor Tony, fuente