У меня есть код функция для дерева каталогов GET. В настоящее время я использую API OS для этого. Все в порядке, если я использую с dllimport, но Рослинатор сказал мне так:
«отметьте метод 'findfirstfile' с 'LibraryImportAttribute' вместо« dllimportAttribute 'для генерации P/Invoke Marshalling Code во время компиляции ».
public class AdditionalInfo
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct WIN32_FIND_DATA
{
public FileAttributes dwFileAttributes;
public uint ftCreationTime_dwLowDateTime;
public uint ftCreationTime_dwHighDateTime;
public uint ftLastAccessTime_dwLowDateTime;
public uint ftLastAccessTime_dwHighDateTime;
public uint ftLastWriteTime_dwLowDateTime;
public uint ftLastWriteTime_dwHighDateTime;
public uint nFileSizeHigh;
public uint nFileSizeLow;
public uint dwReserved0;
public uint dwReserved1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternateFileName;
}
}
Я просто использую атрибут LibraryImport для лучшей производительности
У меня есть код функция для дерева каталогов GET. В настоящее время я использую API OS для этого. Все в порядке, если я использую с dllimport, но Рослинатор сказал мне так: «отметьте метод 'findfirstfile' с 'LibraryImportAttribute' вместо« dllimportAttribute 'для генерации P/Invoke Marshalling Code во время компиляции ».[code]public partial class WindowsDirectoryTreeTraversal : IDisposable { [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] private static extern nint FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData);
public async Task GetDirectoryTreeAsync(string path) { var directoryNode = new DirectoryNode(path, true); var tasks = new List(); var stack = new Stack(); stack.Push((directoryNode, path));
try { while (stack.Count > 0) { var (currentNode, currentPath) = stack.Pop(); tasks.Add(ProcessDirectoryAsync(currentNode, currentPath)); }
if ((findFileData.dwFileAttributes & FileAttributes.Directory) != 0) { var subNode = new DirectoryNode(entryPath, true); currentNode.Subitems.Add(subNode); await ProcessDirectoryAsync(subNode, entryPath); } else if (IsArchive(findFileData) && ArchiveRegex().IsMatch(entryName[entryName.LastIndexOf(".")..])) { currentNode.Subitems.Add(new DirectoryNode(entryPath, false)); } } while (FindNextFile(hFindFile, out findFileData)); } catch (Exception e) { Console.WriteLine($"Error reading dir {currentPath}: {e.Message}"); } finally { FindClose(hFindFile); } }
[GeneratedRegex("\\.(zip|tar|7z|rar|zipx)$")] private static partial Regex ArchiveRegex(); } } [/code] Но, например, [b], если я хочу использовать Libaryimport, он получит ошибку [/b], как изображение win32_find_data "/> win32_find_data"/> />[code]public class AdditionalInfo { [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct WIN32_FIND_DATA { public FileAttributes dwFileAttributes; public uint ftCreationTime_dwLowDateTime; public uint ftCreationTime_dwHighDateTime; public uint ftLastAccessTime_dwLowDateTime; public uint ftLastAccessTime_dwHighDateTime; public uint ftLastWriteTime_dwLowDateTime; public uint ftLastWriteTime_dwHighDateTime; public uint nFileSizeHigh; public uint nFileSizeLow; public uint dwReserved0; public uint dwReserved1; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string cFileName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] public string cAlternateFileName; } } [/code] Я просто использую атрибут LibraryImport для лучшей производительности