如何使用 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 等库。
我正在尝试从共享文件夹的 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 等库。