Ejemplo n.º 1
0
        //Code based heavily on https://stackoverflow.com/q/47471744
        static bool FindNextFilePInvokeRecursive(string path, out List <FileInformation> files, out List <DirectoryInformation> directories, Log.Logger logger)
        {
            List <FileInformation>      fileList      = new List <FileInformation>();
            List <DirectoryInformation> directoryList = new List <DirectoryInformation>();
            IntPtr findHandle = INVALID_HANDLE_VALUE;
            List <Tuple <string, DateTime> > info = new List <Tuple <string, DateTime> >();

            try
            {
                findHandle = FindFirstFileW(path + @"\*", out WIN32_FIND_DATAW findData);

                if (findHandle != INVALID_HANDLE_VALUE)
                {
                    do
                    {
                        if (findData.cFileName != "." && findData.cFileName != "..")
                        {
                            string fullPath = path + @"\" + findData.cFileName;

                            if (findData.dwFileAttributes.HasFlag(FileAttributes.Directory) && !findData.dwFileAttributes.HasFlag(FileAttributes.ReparsePoint))
                            {
                                var dirdata = new DirectoryInformation {
                                    FullPath = fullPath, LastWriteTime = findData.ftLastWriteTime.ToDateTime()
                                };
                                directoryList.Add(dirdata);
                                List <FileInformation>      subDirectoryFileList      = new List <FileInformation>();
                                List <DirectoryInformation> subDirectoryDirectoryList = new List <DirectoryInformation>();

                                if (FindNextFilePInvokeRecursive(fullPath, out subDirectoryFileList, out subDirectoryDirectoryList, logger))
                                {
                                    fileList.AddRange(subDirectoryFileList);
                                    directoryList.AddRange(subDirectoryDirectoryList);
                                }
                            }

                            else if (!findData.dwFileAttributes.HasFlag(FileAttributes.Directory))
                            {
                                var filedata = new FileInformation {
                                    FullPath = fullPath, LastWriteTime = findData.ftLastWriteTime.ToDateTime(), Size = (long)findData.nFileSizeLow + (long)findData.nFileSizeHigh * 4294967296
                                };
                                fileList.Add(filedata);
                            }
                        }
                    } while (FindNextFile(findHandle, out findData));
                }
            }

            catch (Exception exception)
            {
                Console.WriteLine(exception.ToString());

                if (findHandle != INVALID_HANDLE_VALUE)
                {
                    FindClose(findHandle);
                }

                files       = null;
                directories = null;
                return(false);
            }

            if (findHandle != INVALID_HANDLE_VALUE)
            {
                FindClose(findHandle);
            }

            files       = fileList;
            directories = directoryList;
            return(true);
        }
Ejemplo n.º 2
0
        static bool FindNextFilePInvokeRecursiveParalleled(string path, out List <FileInformation> files, out List <DirectoryInformation> directories, Log.Logger logger)
        {
            List <FileInformation> fileList           = new List <FileInformation>();
            object fileListLock                       = new object();
            List <DirectoryInformation> directoryList = new List <DirectoryInformation>();
            object directoryListLock                  = new object();
            IntPtr findHandle = INVALID_HANDLE_VALUE;
            List <Tuple <string, DateTime> > info = new List <Tuple <string, DateTime> >();

            try
            {
                path       = path.EndsWith(@"\") ? path : path + @"\";
                findHandle = FindFirstFileW(path + @"*", out WIN32_FIND_DATAW findData);

                if (findHandle != INVALID_HANDLE_VALUE)
                {
                    do
                    {
                        if (findData.cFileName != "." && findData.cFileName != "..")
                        {
                            string fullPath = path + findData.cFileName;

                            if (findData.dwFileAttributes.HasFlag(FileAttributes.Directory) && !findData.dwFileAttributes.HasFlag(FileAttributes.ReparsePoint))
                            {
                                var dirdata = new DirectoryInformation {
                                    FullPath = fullPath, LastWriteTime = findData.ftLastWriteTime.ToDateTime()
                                };
                                directoryList.Add(dirdata);
                            }

                            else if (!findData.dwFileAttributes.HasFlag(FileAttributes.Directory))
                            {
                                var filedata = new FileInformation {
                                    FullPath = fullPath, LastWriteTime = findData.ftLastWriteTime.ToDateTime()
                                };
                                fileList.Add(filedata);
                            }
                        }
                    } while (FindNextFile(findHandle, out findData));

                    directoryList.AsParallel().ForAll(x =>
                    {
                        List <FileInformation> subDirectoryFileList           = new List <FileInformation>();
                        List <DirectoryInformation> subDirectoryDirectoryList = new List <DirectoryInformation>();

                        if (FindNextFilePInvokeRecursive(x.FullPath, out subDirectoryFileList, out subDirectoryDirectoryList, logger))
                        {
                            lock (fileListLock)
                            {
                                fileList.AddRange(subDirectoryFileList);
                            }

                            lock (directoryListLock)
                            {
                                directoryList.AddRange(subDirectoryDirectoryList);
                            }
                        }
                    });
                }
            }

            catch (Exception exception)
            {
                Console.WriteLine(exception.ToString());

                if (findHandle != INVALID_HANDLE_VALUE)
                {
                    FindClose(findHandle);
                }

                files       = null;
                directories = null;
                return(false);
            }

            if (findHandle != INVALID_HANDLE_VALUE)
            {
                FindClose(findHandle);
            }

            files       = fileList;
            directories = directoryList;
            return(true);
        }