使用 C 通过模式匹配搜索 drectory 中的文件#

Search the files in drectory with pattern matching using C#

提问人:Neeraj Kumar Gupta 提问时间:5/12/2023 最后编辑:Neeraj Kumar Gupta 更新时间:5/12/2023 访问量:80

问:

我正在努力将 vb.net 中的旧 Windown 表单应用程序迁移到 .net 核心 api (C#)。

有一个用 VB.net 编写的代码语句来搜索目录中的文件

Function HasDoc(ByVal branch As String, ByVal sender As String, ByVal appName As String) As Boolean
     Dim strPath = "T:\" + appName + branch + "\" + sender + "\_" + branch + "_*.*"
     dim ls_files = Dir(strPath, FileAttribute.Archive)
     dim bolExist as Boolean
     If ls_files = Nothing Then
        bolExist = False
     Else
        bolExist = True
     End If
     return bolExist 
End Function 

我正在使用 c# 语句复制以下代码行

dim ls_files = Dir(strPath, FileAttribute.Archive)

C# 代码

    public bool HasDoc(string appName, string branch, string sender)
    {
       
        var filesPath = "T:\\" + appName + branch + @"\" + sender;
        var strPatt = "_" + branch + "_*.*";
       
        if (System.IO.Directory.Exists(filesPath))
             return Directory.EnumerateFiles(filesPath, strPatt).Any();

        return false;
                    
    }

我用 C# 编写的代码,性能很慢,而且我不确定如何使用?遗留代码的性能比我的要快,上面代码搜索文件的文件位置包含数百万个文档。FileAttribute.Archive

请建议我可以使用什么来复制相同的 Vb.net 代码行为

c# vb.net boost-filesystem system.io.file

评论

0赞 Rand Random 5/12/2023
变量的内容是什么?filesPath
0赞 Rand Random 5/12/2023
你意识到你的 c# 无法编译吗?- dotnetfiddle.net/FQ4kXv
0赞 Neeraj Kumar Gupta 5/12/2023
嗨,@RandRandom,我更新了我的帖子,对不起,我只在初稿中选择了选定的代码行,现在更正了
4赞 Rand Random 5/12/2023
仍然无法编译,由于您的主张,我对此很挑剔 - 不能真正说,当您不向我们展示您实际在做什么时,您的性能问题是什么,并且由于您的代码无法编译,我很确定您没有向我们展示您真正在做什么 - 因此无法分析性能问题(编辑: 到晚)performance is very slow
1赞 Panagiotis Kanavos 5/12/2023
这不是 VB.NET 代码,而是 1990 年代的 VB 6。 是可用于任何语言的 .NET 类。 是映射到实际 .NET 类的旧关键字。与其尝试转换 30 年前的代码,不如先尝试了解它的实际作用,然后尝试重写它System.IO.DirectoryDir

答:

1赞 Panagiotis Kanavos 5/12/2023 #1

该调用将搜索与模式匹配并设置了属性的文件。 实际上是一个 VB6 函数,它保留在 VB.NET 中只是为了方便迁移到新环境。在它下面使用与 C# 相同的类,例如 DirectoryInfo.GetFileSystemInfos。无法按属性进行筛选,因此实现会循环访问所有文件并检查其属性。Dir(strPath, FileAttribute.Archive)ArchiveDir

便利库允许您使用与 VB.NET 相同的函数,例如 Dir,但这些函数现在很少使用。Microsoft.VisualBasic.*

可以直接在 C# 中使用该类。 返回一个数组,其中包含表示文件夹的所有内容(包括目录和文件)的对象。您可以改用 return an,该 an 仅在您读取项目时返回它们。由于您只想要文件,因此可以使用 代替 .这将返回一个而不是 ,它允许您检查文件的属性。DirectoryInfoGetFileSystemInfosEnumerateFileSystemInfosIEnumerable<>EnumerateFilesEnumerateFileSystemInfosIEnumerable<FileInfo>string[]

例如:

var dir= new DirectoryInfo(dirPath);
var pattern=$"_{branch}_*.*";

var files=dir.EnumerateFiles(pattern);
var found=files.Any(file=>file.Attributes.HasFlag(FileAttribute.Archive));

您可以交换,甚至可以查看这是否会影响性能。EnumerateFilesGetFilesGetFileSystemInfos

所有这些函数都接受一个 EnumerationOptions 参数,该参数可用于指定递归深度、缓冲区大小等。

var options=new EnumerationOptions {
    BufferSize = 16384
};
var files=dir.EnumerateFiles(pattern,options );

评论

0赞 Neeraj Kumar Gupta 5/12/2023
我想知道如何将“存档”归因应用于文件?我的意思是它将在哪个事件中应用?你有什么想法吗?
1赞 Panagiotis Kanavos 5/12/2023
这是多个文件系统中使用的文件属性,可返回到 CP/M,用于标记自上次备份以来已更改的文件(无论这意味着什么)。“备份”程序或脚本在复制文件后会清除此问题。该属性可以手动设置或清除,这使得它不安全。现代备份程序不依赖于它。我怀疑原始代码用它来定期查找和处理修改后的文件。