如何使用 C# 和 SMBLibrary 获取文件列表的文件信息

How to get file information of list of files using C# and SMBLibrary

我正在尝试从共享文件夹的 Excel 电子表格列表中获取文件信息,例如文件名、上次修改 date/time 和文件大小等。我使用 C# 和 Tal Aloni 的 SMBLibary 1.4.8 来做到这一点。

我需要帮助从 'List' class fileList 中获取文件信息。以下是目前有效的程序片段。我能够登录 SMB 服务器并连接到共享文件夹“MPDS”。我处理的文件夹有 9 Excel 个电子表格。当我打印出 'fileList' 元素计数时,它返回 9(日志语句:log.LogInformation("Number of fileList element: " + fileList.Count.ToString());).

感谢任何给我帮助或提示的人。

注意:我用描述替换了 IP 和代码段的凭据。

var client = new SMB2Client();
bool isConnected = client.Connect(IPAddress.Parse("<IP address>"), SMBTransportType.DirectTCPTransport);
if (isConnected)
{
    log.LogInformation("Connected to SMB");
    NTStatus status = client.Login("<domain>", "<user ID>", "<password>");
    if (status == NTStatus.STATUS_SUCCESS)
    {
        log.LogInformation("Logged in as username");
        string filePath = @"Purchasing Admin\D365\Load Templates\Test Templates\" + cFileName + ".txt";
        ISMBFileStore fileStore = client.TreeConnect("MPDS", out status);
        status = fileStore.CreateFile(out object directoryHandle, out FileStatus fileStatus, @"Purchasing Admin\D365\Load Templates\Test Templates", AccessMask.GENERIC_READ, FileAttributes.Directory, ShareAccess.Read | ShareAccess.Write, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, null);
        if (status == NTStatus.STATUS_SUCCESS)
        {
            status = fileStore.QueryDirectory(out List<QueryDirectoryFileInformation> fileList, directoryHandle, "*.xlsx", FileInformationClass.FileDirectoryInformation);
            log.LogInformation("Number of fileList element: " + fileList.Count.ToString());

            status = fileStore.CloseFile(directoryHandle);
        }
    }

}

您几乎已经掌握了您提供的代码示例中的内容。您只需要检查 fileList 中返回的文件,但需要转换为适当的 FileDirectoryInformation 类型以获得您正在寻找的文件属性。例如:

if (status == NTStatus.STATUS_SUCCESS)
{
    List<QueryDirectoryFileInformation> fileList;
    status = fileStore.QueryDirectory(out fileList, directoryHandle, "*", FileInformationClass.FileDirectoryInformation);
    status = fileStore.CloseFile(directoryHandle);

    //
    // Here we are casting each item in the fileList to a FileDirectoryInformation 
    // type that holds the attributes you are looking for. 
    // 

    foreach(FileDirectoryInformation file in fileList)
    {
        Console.WriteLine($"Filename: {file.FileName}");
        Console.WriteLine($"File Size: {file.AllocationSize / 1024}KB");
        Console.WriteLine($"Created Date: {file.CreationTime.ToString("f")}");
        Console.WriteLine($"Last Modified Date: {file.LastWriteTime.ToString("f")}");
        Console.WriteLine();
        Console.WriteLine();                            
    }
}

请注意,我只是假设您要查找的文件大小以 KB 为单位,但还有更先进的技术可以生成更好的人类可读大小(您可以查看 Humanizer 等库。