private void CommonInit() { Contract.Assert(searchCriteria != null && searchData != null, "searchCriteria and searchData should be initialized"); // Execute searchCriteria against the current directory String searchPath = Path.InternalCombine(searchData.fullPath, searchCriteria); Win32Native.WIN32_FIND_DATA data = new Win32Native.WIN32_FIND_DATA(); // Open a Find handle #if MONO int error; _hnd = new SafeFindHandle(MonoIO.FindFirstFile(searchPath, out data.cFileName, out data.dwFileAttributes, out error)); #else _hnd = Win32Native.FindFirstFile(searchPath, data); #endif if (_hnd.IsInvalid) { #if MONO int hr = error; #else int hr = Marshal.GetLastWin32Error(); #endif if (hr != Win32Native.ERROR_FILE_NOT_FOUND && hr != Win32Native.ERROR_NO_MORE_FILES) { HandleError(hr, searchData.fullPath); } else { // flag this as empty only if we're searching just top directory // Used in fast path for top directory only empty = searchData.searchOption == SearchOption.TopDirectoryOnly; } } // fast path for TopDirectoryOnly. If we have a result, go ahead and set it to // current. If empty, dispose handle. if (searchData.searchOption == SearchOption.TopDirectoryOnly) { if (empty) { _hnd.Dispose(); } else { SearchResult searchResult = CreateSearchResult(searchData, data); if (_resultHandler.IsResultIncluded(searchResult)) { current = _resultHandler.CreateObject(searchResult); } } } // for AllDirectories, we first recurse into dirs, so cleanup and add searchData // to the stack else { _hnd.Dispose(); searchStack.Add(searchData); } }
private void CommonInit() { Contract.Assert(_searchCriteria != null && _searchData != null, "searchCriteria and searchData should be initialized"); // Execute searchCriteria against the current directory PathHelpers.ThrowIfEmptyOrRootedPath(_searchCriteria); String searchPath = Path.Combine(_searchData.fullPath, _searchCriteria); Interop.WIN32_FIND_DATA data = new Interop.WIN32_FIND_DATA(); // Open a Find handle _hnd = Interop.mincore.FindFirstFile(searchPath, ref data); if (_hnd.IsInvalid) { int errorCode = Marshal.GetLastWin32Error(); if (errorCode != Interop.ERROR_FILE_NOT_FOUND && errorCode != Interop.ERROR_NO_MORE_FILES) { HandleError(errorCode, _searchData.fullPath); } else { // flag this as empty only if we're searching just top directory // Used in fast path for top directory only _empty = _searchData.searchOption == SearchOption.TopDirectoryOnly; } } // fast path for TopDirectoryOnly. If we have a result, go ahead and set it to // current. If empty, dispose handle. if (_searchData.searchOption == SearchOption.TopDirectoryOnly) { if (_empty) { _hnd.Dispose(); } else { SearchResult searchResult = CreateSearchResult(_searchData, data); if (_resultHandler.IsResultIncluded(searchResult)) { current = _resultHandler.CreateObject(searchResult); } } } // for AllDirectories, we first recurse into dirs, so cleanup and add searchData // to the stack else { _hnd.Dispose(); _searchStack.Add(_searchData); } }
private bool IsResultIncluded(ref Interop.mincore.WIN32_FIND_DATA findData, out TSource result) { Contract.Requires(findData.cFileName.Length != 0 && !Path.IsPathRooted(findData.cFileName), "Expected file system enumeration to not have empty file/directory name and not have rooted name"); return(_resultHandler.IsResultIncluded(_searchData.FullPath, _searchData.UserPath, ref findData, out result)); }
private bool IsResultIncluded(ref Interop.Kernel32.WIN32_FIND_DATA findData, out TSource result) { Debug.Assert(findData.cFileName.Length != 0 && !Path.IsPathRooted(findData.cFileName.GetStringFromFixedBuffer()), "Expected file system enumeration to not have empty file/directory name and not have rooted name"); return(_resultHandler.IsResultIncluded(_searchData.FullPath, _searchData.UserPath, ref findData, out result)); }