private IEnumerable <FileMapping> GetActualFiles(string fileName) { NativeMethods.Win32FindData findFileData = new NativeMethods.Win32FindData(); List <FileMapping> actualFiles = new List <FileMapping>(); IntPtr hFind = NativeMethods.FindFirstFileW(fileName, ref findFileData); if (hFind != new IntPtr(-1)) { do { //if (findFileData.cFileName.Equals(@".") || findFileData.cFileName.Equals(@"..")) // continue; //if ((findFileData.dwFileAttributes & 0x10) != 0) //{ // string path = Path.Combine(Path.GetDirectoryName(fileName) ?? throw new InvalidOperationException(), findFileData.cFileName); // actualFiles.Add(new FileMapping(path, findFileData)); //} //else //{ string path = Path.Combine(Path.GetDirectoryName(fileName) ?? throw new InvalidOperationException(), findFileData.cFileName); actualFiles.Add(new FileMapping(path, findFileData)); //} }while (NativeMethods.FindNextFileW(hFind, ref findFileData)); } NativeMethods.FindClose(hFind); //Console.WriteLine("///////////////////ACTUAL///////////////////"); //foreach (FileMapping actualFile in actualFiles) //{ // _monitor.Log($"{actualFile.FindData.cFileName}"); //} //Console.WriteLine("///////////////////ACTUAL///////////////////"); return(actualFiles); }
private bool FindNextFileCallBack(IntPtr hndfindfile, ref NativeMethods.Win32FindData lpfindfiledata) { if (!_searchingFiles.ContainsKey(hndfindfile)) { return(NativeMethods.FindNextFileW(hndfindfile, ref lpfindfiledata)); } Queue <FileMapping> queue = _searchingFiles[hndfindfile]; if (queue.Count == 0) { return(false); } lpfindfiledata = queue.Dequeue().FindData; _monitor.Log(lpfindfiledata.cFileName); /*还有文件的时候,返回true,没了返回False*/ return(true); }
private IntPtr FindFirstFileCallBack(string pfilename, ref NativeMethods.Win32FindData pfindfiledata) { if (PathWhiteList.Count > 0 && !PathWhiteList.Contains(Path.GetDirectoryName(pfilename))) { return(NativeMethods.FindFirstFileW(pfilename, ref pfindfiledata)); } FileMappingDic = _monitor.GetFileMappingDic(_channel); string matchPath = pfilename.Replace(@"\", @"\\") .Replace(".", @"\.") .Replace("*", ".*").Replace("?", "."); Regex regex = new Regex(matchPath); IEnumerable <FileMapping> actualFiles = GetActualFiles(pfilename); Queue <FileMapping> matchedFiles = new Queue <FileMapping>(actualFiles); if (FileMappingDic != null) { foreach (string key in FileMappingDic.Keys.Where(key => regex.Match(key).Value == key)) { matchedFiles.Enqueue(FileMappingDic[key]); } } //没找到返回INVALID_HANDLE_VALUE if (matchedFiles.Count == 0) { return(new IntPtr(-1)); } IntPtr ptr = NativeMethods.FindFirstFileW(matchedFiles.Peek().ActualPath, ref pfindfiledata); pfindfiledata = matchedFiles.Peek().FindData; matchedFiles.Dequeue(); _searchingFiles.Add(ptr, matchedFiles); _monitor.Log(pfindfiledata.cFileName); return(ptr); }
public FileMapping(string actualPath, NativeMethods.Win32FindData findData) { PuppetPath = ActualPath = actualPath; _findData = findData; }