コード例 #1
1
		public static extern SafeFindHandle FindFirstFileExW(
			string lpFileName,
			FINDEX_INFO_LEVELS fInfoLevelId,
			out WIN32_FIND_DATAW lpFindFileData,
			FINDEX_SEARCH_OPS fSearchOp,
			IntPtr lpSearchFilter,
			FINDEX_ADDITIONAL_FLAGS dwAdditionalFlags);
コード例 #2
0
 internal static unsafe extern SafeFindHandle FindFirstFileEx(
     char *pszPattern,
     FINDEX_INFO_LEVELS fInfoLevelId,
     out WIN32_FIND_DATA lpFindFileData,
     FINDEX_SEARCH_OPS fSearchOp,
     IntPtr lpSearchFilter,
     FINDEX_ADDITIONAL_FLAGS dwAdditionalFlags);
コード例 #3
0
ファイル: FastIO.cs プロジェクト: maxigaz/AngelLoader
 private static extern SafeSearchHandle FindFirstFileEx(
     string lpFileName,
     FINDEX_INFO_LEVELS fInfoLevelId,
     out WIN32_FIND_DATAW lpFindFileData,
     FINDEX_SEARCH_OPS fSearchOp,
     IntPtr lpSearchFilter,
     int dwAdditionalFlags);
コード例 #4
0
 private static extern SafeFindHandle FindFirstFileEx(
     string lpFileName,
     FINDEX_INFO_LEVELS fInfoLevelId, //FINDEX_INFO_LEVELS
     [In, Out] WIN32_FIND_DATA lpFindFileData,
     FINDEX_SEARCH_OPS fSearchOp,     //FINDEX_SEARCH_OPS
     IntPtr lpSearchFilter,
     FIND_FIRST_EX dwAdditionalFlags);
コード例 #5
0
 internal static extern SafeFindHandle FindFirstFileExW(
     string lpFileName,
     FINDEX_INFO_LEVELS fInfoLevelId,
     out WIN32_FIND_DATA lpFindFileData,
     FINDEX_SEARCH_OPS fSearchOp,
     IntPtr lpSearchFilter,                  // Reserved
     int dwAdditionalFlags);
コード例 #6
0
ファイル: Paste.cs プロジェクト: askfriends/Files
        public static long CalculateFileSize(string path)
        {
            if (string.IsNullOrEmpty(path))
            {
                // In MTP devices calculating folder size would be too slow
                // Also should use StorageFolder methods instead of FindFirstFileExFromApp
                return(0);
            }

            long size = 0;
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
            int additionalFlags = FIND_FIRST_EX_LARGE_FETCH;

            IntPtr hFile = FindFirstFileExFromApp(path, findInfoLevel, out WIN32_FIND_DATA findData, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero,
                                                  additionalFlags);

            if (hFile.ToInt64() != -1)
            {
                if (((FileAttributes)findData.dwFileAttributes & FileAttributes.Directory) != FileAttributes.Directory)
                {
                    size += findData.GetSize();
                }
                FindClose(hFile);
                Debug.WriteLine("Individual file size for Progress UI will be reported as: " + size.ToString() + " bytes");
                return(size);
            }
            else
            {
                return(0);
            }
        }
コード例 #7
0
        private void NextFind()
        {
            var                watch = Stopwatch.StartNew();
            var                path  = @"C:\";
            WIN32_FIND_DATA    findData;
            FINDEX_INFO_LEVELS findInfoLevel   = FINDEX_INFO_LEVELS.FindExInfoStandard;
            int                additionalFlags = 0;

            if (Environment.OSVersion.Version.Major >= 6)
            {
                findInfoLevel   = FINDEX_INFO_LEVELS.FindExInfoBasic;
                additionalFlags = FIND_FIRST_EX_LARGE_FETCH;
            }

            IntPtr hFile = FindFirstFileExFromApp(path + "\\*.*", findInfoLevel, out findData, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero,
                                                  additionalFlags);
            var count = 0;

            if (hFile.ToInt64() != -1)
            {
                do
                {
                    if (((System.IO.FileAttributes)findData.dwFileAttributes & System.IO.FileAttributes.Directory) == System.IO.FileAttributes.System)
                    {
                        // do something with it
                        var fn = findData.cFileName;
                        Debug.WriteLine(fn);
                        ++count;
                    }
                } while (FindNextFile(hFile, out findData));

                FindClose(hFile);
            }
            Debug.WriteLine("count " + count + ", ellapsed=" + watch.ElapsedMilliseconds);
        }
コード例 #8
0
 internal static extern IntPtr FindFirstFileEx(
     string lpFileName,
     FINDEX_INFO_LEVELS fInfoLevelId,
     [In][Out] WIN32_FIND_DATA lpFindFileData,
     FINDEX_SEARCH_OPS fSearchOp,
     IntPtr lpSearchFilter,
     int dwAdditionalFlags);
コード例 #9
0
ファイル: FindFile.cs プロジェクト: radiaku/csharptest-net
 public static extern IntPtr FindFirstFileEx(
     IntPtr lpFileName,
     FINDEX_INFO_LEVELS fInfoLevelId,
     out WIN32_FIND_DATA lpFindFileData,
     FINDEX_SEARCH_OPS fSearchOp,
     IntPtr lpSearchFilter,
     FINDEX_ADDITIONAL_FLAGS dwAdditionalFlags);
コード例 #10
0
        public static DateTime GetFileModificationTime(string path)
        {
            WIN32_FIND_DATA    findDataResult;
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
            var dateModified = DateTime.MinValue;

            int additionalFlags = 0;

            if (Environment.OSVersion.Version.Major >= 6)
            {
                findInfoLevel   = FINDEX_INFO_LEVELS.FindExInfoBasic;
                additionalFlags = FIND_FIRST_EX_LARGE_FETCH;
            }

            IntPtr hFile = FindFirstFileExFromApp(path, findInfoLevel, out findDataResult, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, additionalFlags);

            if (hFile.ToInt64() != -1)
            {
                long datemodifiedoffset = findDataResult.lastWriteTime.dwHighDateTime;
                datemodifiedoffset = (datemodifiedoffset << 32);
                datemodifiedoffset = datemodifiedoffset | (long)(uint)findDataResult.lastWriteTime.dwLowDateTime;
                dateModified       = System.DateTimeOffset.FromFileTime(datemodifiedoffset).ToUniversalTime().DateTime;
                FindClose(hFile);
            }

            return(dateModified);
        }
コード例 #11
0
 private static extern SafeFindHandle FindFirstFileTransactedW(
     [In, MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
     [In] FINDEX_INFO_LEVELS fInfoLevelId,             // TODO: Won't work.
     [Out] out WIN32_FIND_DATA lpFindFileData,
     [In] FINDEX_SEARCH_OPS fSearchOp,
     IntPtr lpSearchFilter,
     [In] uint dwAdditionalFlags,
     [In] SafeTxHandle hTransaction);
コード例 #12
0
 public static extern IntPtr FindFirstFileExW(
     string lpFileName,
     FINDEX_INFO_LEVELS fInfoLevelId,
     out WIN32_FIND_DATA lpFindFileData,
     uint fSearchOp,                            // This never actually has meaning and is likely a holdover of 9x
                                                // set it to 0 to avoid failing parameter checks.
     IntPtr lpSearchFilter,                     // Reserved
     FindFirstFileExFlags dwAdditionalFlags);
コード例 #13
0
 public extern static System.IntPtr FindFirstFileTransactedW(
     [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string lpFileName,
     FINDEX_INFO_LEVELS fInfoLevelId,
     out WIN32_FIND_DATAW lpFindFileData,
     FINDEX_SEARCH_OPS fSearchOp,
     System.IntPtr lpSearchFilter,
     int dwAdditionalFlags,
     System.IntPtr hTransaction);
コード例 #14
0
 public static extern IntPtr FindFirstFileEx(
     [MarshalAs(UnmanagedType.LPWStr)]
     string lpFileName,
     FINDEX_INFO_LEVELS fInfoLevelId,
     out WIN32_FIND_DATA lpFindFileData,
     FINDEX_SEARCH_OPS fSearchOp,
     IntPtr lpSearchFilter,
     int dwAdditionalFlags);
コード例 #15
0
 internal static extern SafeFileHandle FindFirstFileTransacted(
     [In] string lpDirSpec,
     [In] FINDEX_INFO_LEVELS fInfoLevelId,
     [Out] out WIN32_FIND_DATA lpFindFileData,
     [In] FINDEX_SEARCH_OPS fSearchOp,
     [In] IntPtr lpSearchFilter,
     [In] int dwAdditionalFlags,
     [In] KtmTransactionHandle hTransaction);
コード例 #16
0
        //Count File in a directory Fast
        public static uint FCount(string path, string searchPattern)
        {
            uint               count = 0;
            WIN32_FIND_DATA    findData;
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;

            string pattern = @"\\$";

            path = Regex.Replace(path, pattern, "", RegexOptions.IgnoreCase);

            searchtext = path + searchPattern;
            IntPtr        hFile   = FindFirstFileExFromApp(searchtext, findInfoLevel, out findData, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, FIND_FIRST_EX_LARGE_FETCH);
            List <string> subDirs = new List <string>();

            //check for access denied
            if (hFile != new IntPtr(-1))
            {
                do
                {
                    if (findData.cFileName == "." || findData.cFileName == "..")
                    {
                        continue;
                    }
                    if ((findData.dwFileAttributes & (uint)FileAttributes.Directory) == (uint)FileAttributes.Directory)
                    {
                        subDirs.Add(path + "\\" + findData.cFileName);
                    }
                    else
                    {
                        //count files
                        count++;
                    }
                } while (FindNextFile(hFile, out findData));
                //object locker = new object();
                //Parallel.ForEach(subDirs, subdir =>
                //{
                //  var temp = FCount(subdir, searchPattern);
                //  //apply lock when adding result from each thread to prevent conflict
                //  lock (locker)
                //  {
                //    count+= temp;
                //  }
                //}
                //);
                foreach (var subdir in subDirs)
                {
                    count += FCount(subdir, searchPattern);
                }
            }
            else
            {
                Debug.WriteLine($"Access Denied::  {searchtext}");
            }
            FindClose(hFile);
            return(count);
        }
コード例 #17
0
        public static async Task <long> CalculateFolderSizeAsync(string path)
        {
            if (string.IsNullOrEmpty(path))
            {
                // In MTP devices calculating folder size would be too slow
                // Also should use StorageFolder methods instead of FindFirstFileExFromApp
                return(0);
            }

            long size = 0;
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
            int additionalFlags = FIND_FIRST_EX_LARGE_FETCH;

            IntPtr hFile = FindFirstFileExFromApp(
                path + "\\*.*",
                findInfoLevel,
                out WIN32_FIND_DATA findData,
                FINDEX_SEARCH_OPS.FindExSearchNameMatch,
                IntPtr.Zero,
                additionalFlags);

            int count = 0;

            if (hFile.ToInt64() != -1)
            {
                do
                {
                    if (((FileAttributes)findData.dwFileAttributes & FileAttributes.Directory) != FileAttributes.Directory)
                    {
                        size += findData.GetSize();
                        ++count;
                    }
                    else if (((FileAttributes)findData.dwFileAttributes & FileAttributes.Directory) == FileAttributes.Directory)
                    {
                        if (findData.cFileName != "." && findData.cFileName != "..")
                        {
                            string itemPath = Path.Combine(path, findData.cFileName);

                            size += await CalculateFolderSizeAsync(itemPath);

                            ++count;
                        }
                    }
                } while (FindNextFile(hFile, out findData));
                FindClose(hFile);
                return(size);
            }
            else
            {
                return(0);
            }
        }
コード例 #18
0
        /// <summary>
        /// This function is used to determine whether or not a folder has any contents.
        /// </summary>
        /// <param name="targetPath">The path to the target folder</param>
        ///
        public static bool CheckForFilesFolders(string targetPath)
        {
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
            int additionalFlags = FIND_FIRST_EX_LARGE_FETCH;

            IntPtr hFile = FindFirstFileExFromApp(targetPath + "\\*.*", findInfoLevel, out WIN32_FIND_DATA _, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, additionalFlags);

            FindNextFile(hFile, out _);
            var result = FindNextFile(hFile, out _);

            FindClose(hFile);
            return(result);
        }
コード例 #19
0
        public static bool GetWin32FindDataForPath(string targetPath, out WIN32_FIND_DATA findData)
        {
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
            int additionalFlags = FIND_FIRST_EX_LARGE_FETCH;

            IntPtr hFile = FindFirstFileExFromApp(targetPath, findInfoLevel, out findData, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, additionalFlags);

            if (hFile.ToInt64() != -1)
            {
                FindClose(hFile);
                return(true);
            }
            return(false);
        }
コード例 #20
0
        public static bool CheckFolderAccessWithWin32(string path)
        {
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
            int    additionalFlags           = FIND_FIRST_EX_LARGE_FETCH;
            IntPtr hFileTsk = FindFirstFileExFromApp(path + "\\*.*", findInfoLevel, out WIN32_FIND_DATA findDataTsk, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero,
                                                     additionalFlags);

            if (hFileTsk.ToInt64() != -1)
            {
                FindClose(hFileTsk);
                return(true);
            }
            return(false);
        }
コード例 #21
0
        public static IEnumerable <string> EnumerateFiles(string path, string searchPattern, SearchOption searchOption)
        {
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
            int additionalFlags = FIND_FIRST_EX_LARGE_FETCH;

            Queue <string> subDirectorys = null;

            if (searchOption == SearchOption.AllDirectories)
            {
                subDirectorys = new Queue <string>();
            }

            do
            {
                IntPtr hFile = FindFirstFileExFromApp(
                    path + "\\" + searchPattern,
                    findInfoLevel,
                    out WIN32_FIND_DATA findData,
                    FINDEX_SEARCH_OPS.FindExSearchNameMatch,
                    IntPtr.Zero,
                    additionalFlags);

                if (hFile.ToInt64() != INVALID_HANDLE_VALUE)
                {
                    do
                    {
                        var attributes = (FileAttributes)findData.dwFileAttributes;

                        if (!attributes.HasFlag(FileAttributes.System))
                        {
                            if (!attributes.HasFlag(FileAttributes.Directory))
                            {
                                yield return(findData.cFileName);
                            }
                            else if (searchOption == SearchOption.AllDirectories && findData.cFileName != "." && findData.cFileName != "..")
                            {
                                subDirectorys.Enqueue(Path.Combine(path, findData.cFileName));
                            }
                        }
                    }while (FindNextFile(hFile, out findData));

                    FindClose(hFile);
                }
                else
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
            }while (searchOption == SearchOption.AllDirectories && subDirectorys.TryDequeue(out path));
        }
コード例 #22
0
        //return just folder names, seperate methods as more of it is stripped out
        public static List <MonitoredFolderItem> GetMinInfo(string path)
        {
            var result = new List <MonitoredFolderItem>();

            WIN32_FIND_DATA    findDataResult;
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;

            int additionalFlags = 0;

            if (Environment.OSVersion.Version.Major >= 6)
            {
                findInfoLevel   = FINDEX_INFO_LEVELS.FindExInfoBasic;
                additionalFlags = FIND_FIRST_EX_LARGE_FETCH;
            }

            IntPtr hFile = FindFirstFileExFromApp((@"\\?\" + path + "\\*.*"), findInfoLevel, out findDataResult, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, additionalFlags);
            var    count = 0;

            if (hFile.ToInt64() != -1)
            {
                do
                {
                    if (IsSystemItem(findDataResult.itemName))
                    {
                        continue;
                    }

                    // NOTE: This section was originally commented out when the PInvoke method was abandoned
                    MonitoredFolderItem fileitem = new MonitoredFolderItem(findDataResult.itemName);
                    result.Add(fileitem);
                    //set attributes
                    fileitem.attributes = (FileAttributes)findDataResult.itemAttributes;

                    //set parent folder
                    fileitem.ParentFolderPath = path;
                    ++count;
                } while (FindNextFile(hFile, out findDataResult));

                FindClose(hFile);
            }

            return(result);
        }
コード例 #23
0
        public static bool CheckFolderForHiddenAttribute(string path)
        {
            if (string.IsNullOrEmpty(path))
            {
                return(false);
            }
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
            int    additionalFlags           = FIND_FIRST_EX_LARGE_FETCH;
            IntPtr hFileTsk = FindFirstFileExFromApp(path + "\\*.*", findInfoLevel, out WIN32_FIND_DATA findDataTsk, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero,
                                                     additionalFlags);

            if (hFileTsk.ToInt64() == -1)
            {
                return(false);
            }
            var isHidden = ((FileAttributes)findDataTsk.dwFileAttributes & FileAttributes.Hidden) == FileAttributes.Hidden;

            FindClose(hFileTsk);
            return(isHidden);
        }
コード例 #24
0
        public async Task <int> FindFilesWithWin32(string folderPath, int count)
        {
            WIN32_FIND_DATA    findData;
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
            int additionalFlags = FIND_FIRST_EX_LARGE_FETCH;

            IntPtr hFile = FindFirstFileExFromApp(folderPath + "\\*.*",
                                                  findInfoLevel,
                                                  out findData,
                                                  FINDEX_SEARCH_OPS.FindExSearchNameMatch,
                                                  IntPtr.Zero,
                                                  additionalFlags);

            if (hFile.ToInt32() != -1)
            {
                do
                {
                    if (((FileAttributes)findData.dwFileAttributes & FileAttributes.Directory) != FileAttributes.Directory)
                    {
                        var fn = findData.cFileName;
                        Debug.WriteLine(fn);
                        ++count;
                    }
                    else
                    {
                        if (findData.cFileName != "." && findData.cFileName != "..")
                        {
                            count = await FindFilesWithWin32(folderPath + "\\" + findData.cFileName, count);
                        }
                    }
                } while (FindNextFile(hFile, out findData));

                FindClose(hFile);
            }

            return(count);
        }
コード例 #25
0
ファイル: Methods.cs プロジェクト: shijiaxing/Win32Interop
 public static extern IntPtr FindFirstFileEx(
     [In] [MarshalAs(UnmanagedType.LPTStr)] string lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, IntPtr lpFindFileData, FINDEX_SEARCH_OPS fSearchOp,
     IntPtr lpSearchFilter, FIND_FIRST dwAdditionalFlags);
コード例 #26
0
 private static extern SafeFindHandle FindFirstFileExPrivate(string lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, ref WIN32_FIND_DATA lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, IntPtr lpSearchFilter, int dwAdditionalFlags);
コード例 #27
0
 public static unsafe extern IntPtr FindFirstFileExW(string lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, void *lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, IntPtr lpSearchFilter, int dwAdditionalFlags);
コード例 #28
0
 public static unsafe extern IntPtr FindFirstFileExW(string lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, void* lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, IntPtr lpSearchFilter, int dwAdditionalFlags);
コード例 #29
0
ファイル: Kernel32.cs プロジェクト: vbfox/pinvoke
 public static unsafe extern SafeFindFilesHandle FindFirstFileEx(string lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, out WIN32_FIND_DATA lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, void* lpSearchFilter, FindFirstFileExFlags dwAdditionalFlags);
コード例 #30
0
ファイル: Kernel32Mockable.cs プロジェクト: ffMathy/pinvoke-1
		public SafeFindFilesHandle FindFirstFileEx(string lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, out WIN32_FIND_DATA lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, IntPtr lpSearchFilter, FindFirstFileExFlags dwAdditionalFlags)
			=> FindFirstFileEx(lpFileName, fInfoLevelId, out lpFindFileData, fSearchOp, lpSearchFilter, dwAdditionalFlags);
コード例 #31
0
ファイル: NativeMethods.cs プロジェクト: CDEApp/CDE
 static internal extern SafeFindFileHandle FindFirstFileExW([In] string lpFileName, [In] FINDEX_INFO_LEVELS fInfoLevelId, [In, Out] WIN32_FIND_DATA lpFindFileData, [In] FINDEX_SEARCH_OPS fSearchOp, [In] IntPtr lpSearchFilter, [In] FINDEX_FLAGS dwAdditionalFlags);
コード例 #32
0
ファイル: BaseProperties.cs プロジェクト: xxxloli123/Files
        public async Task <long> CalculateFolderSizeAsync(string path, CancellationToken token)
        {
            if (string.IsNullOrEmpty(path))
            {
                // In MTP devices calculating folder size would be too slow
                // Also should use StorageFolder methods instead of FindFirstFileExFromApp
                return(0);
            }

            long size = 0;
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
            int additionalFlags = FIND_FIRST_EX_LARGE_FETCH;

            IntPtr hFile = FindFirstFileExFromApp(path + "\\*.*", findInfoLevel, out WIN32_FIND_DATA findData, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero,
                                                  additionalFlags);

            var count = 0;

            if (hFile.ToInt64() != -1)
            {
                do
                {
                    if (((FileAttributes)findData.dwFileAttributes & FileAttributes.Directory) != FileAttributes.Directory)
                    {
                        size += findData.GetSize();
                        ++count;
                        ViewModel.FilesCount++;
                    }
                    else if (((FileAttributes)findData.dwFileAttributes & FileAttributes.Directory) == FileAttributes.Directory)
                    {
                        if (findData.cFileName != "." && findData.cFileName != "..")
                        {
                            var itemPath = Path.Combine(path, findData.cFileName);

                            size += await CalculateFolderSizeAsync(itemPath, token);

                            ++count;
                            ViewModel.FoldersCount++;
                        }
                    }

                    if (size > ViewModel.ItemSizeBytes)
                    {
                        await Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
                        {
                            ViewModel.ItemSizeBytes = size;
                            ViewModel.ItemSize      = ByteSize.FromBytes(size).ToBinaryString().ConvertSizeAbbreviation();
                            SetItemsCountString();
                        });
                    }

                    if (token.IsCancellationRequested)
                    {
                        break;
                    }
                } while (FindNextFile(hFile, out findData));
                FindClose(hFile);
                return(size);
            }
            else
            {
                return(0);
            }
        }
コード例 #33
0
        //function
        public static List <MonitoredFolderItem> GetItems(string path)
        {
            var result = new List <MonitoredFolderItem>();

            var watch = Stopwatch.StartNew();

            WIN32_FIND_DATA    findDataResult;
            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;

            int additionalFlags = 0;

            if (Environment.OSVersion.Version.Major >= 6)
            {
                findInfoLevel   = FINDEX_INFO_LEVELS.FindExInfoBasic;
                additionalFlags = FIND_FIRST_EX_LARGE_FETCH;
            }

            IntPtr hFile = FindFirstFileExFromApp(path + "\\*.*", findInfoLevel, out findDataResult, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, additionalFlags);
            var    count = 0;

            if (hFile.ToInt64() != -1)
            {
                do
                {
                    if (IsSystemItem(findDataResult.itemName))
                    {
                        continue;
                    }

                    // NOTE: This section was originally commented out when the PInvoke method was abandoned
                    MonitoredFolderItem fileitem = new MonitoredFolderItem(findDataResult.itemName);

                    //set attributes
                    fileitem.attributes = (FileAttributes)findDataResult.itemAttributes;

                    //set parent folder
                    fileitem.ParentFolderPath = path;

                    // May need to swap these around if the date is f****d
                    long datecreatedoffset = findDataResult.creationTime.dwHighDateTime;
                    datecreatedoffset    = (datecreatedoffset << 32);
                    datecreatedoffset    = datecreatedoffset | (long)(uint)findDataResult.creationTime.dwLowDateTime;
                    fileitem.DateCreated = System.DateTimeOffset.FromFileTime(datecreatedoffset);

                    //set modified time
                    long datemodifiedoffset = findDataResult.lastWriteTime.dwHighDateTime;
                    datemodifiedoffset    = (datemodifiedoffset << 32);
                    datemodifiedoffset    = datemodifiedoffset | (long)(uint)findDataResult.creationTime.dwLowDateTime;
                    fileitem.DateModified = System.DateTimeOffset.FromFileTime(datemodifiedoffset);

                    //set the size
                    fileitem.Size = (ulong)findDataResult.fileSizeHigh << 32 | (ulong)(uint)findDataResult.fileSizeLow;

                    if (((FileAttributes)findDataResult.itemAttributes & FileAttributes.Directory) == FileAttributes.Directory)
                    {
                        fileitem.IsDir = true;
                    }
                    else
                    {
                        fileitem.IsDir = false;
                    }
                    result.Add(fileitem);

                    ++count;
                } while (FindNextFile(hFile, out findDataResult));

                FindClose(hFile);
            }

            return(result);


            /// Local Functions


            bool IsSystemItem(string itemName)
            {
                if
                (
                    findDataResult.itemName == "." ||
                    findDataResult.itemName == ".."
                )
                {
                    return(true);
                }
                return(false);
            }
        }
コード例 #34
0
 public static unsafe extern SafeFindFilesHandle FindFirstFileEx(string lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, out WIN32_FIND_DATA lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, void *lpSearchFilter, FindFirstFileExFlags dwAdditionalFlags);
 static extern IntPtr FindFirstFileExW(string lpFileName, FINDEX_INFO_LEVELS
 fInfoLevelId, out WIN32_FIND_DATA lpFindFileData, FINDEX_SEARCH_OPS fSearchOp,
 IntPtr lpSearchFilter, uint dwAdditionalFlags);
コード例 #36
0
        public async Task <long> CalculateFolderSizeAsync(string path, CancellationToken token)
        {
            long size = 0;

            FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
            int additionalFlags = FIND_FIRST_EX_LARGE_FETCH;

            IntPtr hFile = FindFirstFileExFromApp(path + "\\*.*", findInfoLevel, out WIN32_FIND_DATA findData, FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero,
                                                  additionalFlags);

            var count = 0;

            if (hFile.ToInt64() != -1)
            {
                do
                {
                    if (((FileAttributes)findData.dwFileAttributes & FileAttributes.Directory) != FileAttributes.Directory)
                    {
                        long fDataFSize = findData.nFileSizeLow;
                        long fileSize;
                        if (fDataFSize < 0 && findData.nFileSizeHigh > 0)
                        {
                            fileSize = fDataFSize + 4294967296 + (findData.nFileSizeHigh * 4294967296);
                        }
                        else
                        {
                            if (findData.nFileSizeHigh > 0)
                            {
                                fileSize = fDataFSize + (findData.nFileSizeHigh * 4294967296);
                            }
                            else if (fDataFSize < 0)
                            {
                                fileSize = fDataFSize + 4294967296;
                            }
                            else
                            {
                                fileSize = fDataFSize;
                            }
                        }
                        size += fileSize;
                        ++count;
                        ViewModel.FilesCount++;
                    }
                    else if (((FileAttributes)findData.dwFileAttributes & FileAttributes.Directory) == FileAttributes.Directory)
                    {
                        if (findData.cFileName != "." && findData.cFileName != "..")
                        {
                            var itemPath = Path.Combine(path, findData.cFileName);

                            size += await CalculateFolderSizeAsync(itemPath, token);

                            ++count;
                            ViewModel.FoldersCount++;
                        }
                    }

                    if (size > ViewModel.ItemSizeBytes)
                    {
                        await Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
                        {
                            ViewModel.ItemSizeBytes = size;
                            ViewModel.ItemSize      = ByteSize.FromBytes(size).ToBinaryString().ConvertSizeAbbreviation();
                            SetItemsCountString();
                        });
                    }

                    if (token.IsCancellationRequested)
                    {
                        break;
                    }
                } while (FindNextFile(hFile, out findData));
                FindClose(hFile);
                return(size);
            }
            else
            {
                return(0);
            }
        }
コード例 #37
0
 internal static extern SafeFindFileHandle FindFirstFileEx([MarshalAs(UnmanagedType.LPWStr)] String lpFileName,
                                                           FINDEX_INFO_LEVELS fInfoLevelId, 
                                                           out WIN32_FIND_DATA lpFindFileData, 
                                                           FINDEX_SEARCH_OPS fSearchOp,
                                                           IntPtr lpSearchFilter, 
                                                           FindExAdditionalFlags dwAdditionalFlags);
コード例 #38
0
        public static async void UpdateFolder(ListedItem folder, CancellationToken cancellationToken)
        {
            CoreDispatcher dispatcher;

            if (folder.PrimaryItemAttribute == Windows.Storage.StorageItemTypes.Folder && folder.FileSizeBytes == 0 && folder.ContainsFilesOrFolders)
            {
                dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;

                await dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
                {
                    folder.FileSize = 0L.ToSizeString();
                });

                _ = await Calculate(folder.ItemPath);
            }

            async Task <long> Calculate(string folderPath)
            {
                if (string.IsNullOrEmpty(folderPath))
                {
                    return(0);
                }

                FINDEX_INFO_LEVELS findInfoLevel = FINDEX_INFO_LEVELS.FindExInfoBasic;
                int additionalFlags = FIND_FIRST_EX_LARGE_FETCH;

                IntPtr hFile = FindFirstFileExFromApp(folderPath + "\\*.*", findInfoLevel, out WIN32_FIND_DATA findData,
                                                      FINDEX_SEARCH_OPS.FindExSearchNameMatch, IntPtr.Zero, additionalFlags);

                long size = 0;

                if (hFile.ToInt64() != -1)
                {
                    do
                    {
                        if (((FileAttributes)findData.dwFileAttributes & FileAttributes.Directory) != FileAttributes.Directory)
                        {
                            size += findData.GetSize();
                        }
                        else if (((FileAttributes)findData.dwFileAttributes & FileAttributes.Directory) == FileAttributes.Directory)
                        {
                            if (findData.cFileName is not "." and not "..")
                            {
                                string path = Path.Combine(folderPath, findData.cFileName);
                                size += await Calculate(path);
                            }
                        }

                        await dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
                        {
                            if (size > folder.FileSizeBytes)
                            {
                                folder.FileSizeBytes = size;
                                folder.FileSize      = size.ToSizeString();
                            }
                            ;
                        });

                        if (cancellationToken.IsCancellationRequested)
                        {
                            break;
                        }
                    } while (FindNextFile(hFile, out findData));
                    FindClose(hFile);
                    return(size);
                }
                else
                {
                    return(0);
                }
            }
        }
コード例 #39
-1
ファイル: NativeMethods.cs プロジェクト: mbbill/vs-chromium
 internal static unsafe extern SafeFindHandle FindFirstFileEx(
     char* pszPattern,
     FINDEX_INFO_LEVELS fInfoLevelId,
     out WIN32_FIND_DATA lpFindFileData,
     FINDEX_SEARCH_OPS fSearchOp,
     IntPtr lpSearchFilter,
     FINDEX_ADDITIONAL_FLAGS dwAdditionalFlags);