public static int EntriesEx(string FullFindFirstFileString, OnFindData FindDataCallback) { FIND_DATA_RAW find_data = new FIND_DATA_RAW(); int rc = 0; IntPtr SearchHandle = IntPtr.Zero; try { SearchHandle = Spi.Native.FindFirstFileEx( FullFindFirstFileString , Native.FINDEX_INFO_LEVELS.FindExInfoBasic , ref find_data , Native.FINDEX_SEARCH_OPS.FindExSearchNameMatch , IntPtr.Zero , Native.FINDEX_ADDITIONAL_FLAGS.FIND_FIRST_EX_LARGE_FETCH); if (SearchHandle == Native.INVALID_HANDLE_VALUE) { rc = Marshal.GetLastWin32Error(); } else { do { if (IsDotOrDotDotDirectory(find_data.cFileName)) { continue; } FindDataCallback(ref find_data); }while (Native.FindNextFileW(SearchHandle, ref find_data)); if (Marshal.GetLastWin32Error() != Native.ERROR_NO_MORE_FILES) { rc = Marshal.GetLastWin32Error(); } } } finally { if (SearchHandle != IntPtr.Zero) { Native.FindClose(SearchHandle); } } return(rc); }
private static void BuildSendData(ref FIND_DATA_RAW find_data, BinaryWriter bw) { int lenFilename = LenOfFilename(find_data.cFileName); byte[] UTF8Filename = new byte[260 * 4]; int UTF8byteswritten = 0; unsafe { fixed (UInt16* ptrFilename = find_data.cFileName) fixed (byte* utf8buffer = UTF8Filename) { char* chars = (char*)ptrFilename; UTF8byteswritten = Encoding.UTF8.GetBytes( chars: chars, charCount: lenFilename, bytes: utf8buffer, byteCount: UTF8Filename.Length); } } bw.Write(UTF8Filename, 0, UTF8byteswritten); bw.Write((byte)0); }