FileInfo 和 DirectoryInfo 类在 Mono - Linux 上的用法
本文关键字:Linux 用法 Mono DirectoryInfo 类在 FileInfo | 更新日期: 2023-09-27 18:20:49
我这里有两个小问题。
-
我正在处理我们要执行的 .net 应用程序之一在Linux上也是如此。我显而易见的选择是使用 Mono 运行它。这应用程序正在使用广泛的文件和目录枚举和收集文件和目录信息。当我通过单声道文档,我发现Mono设计了UnixDirectoryInfo,UnixFileInfo 类分开。我的问题是,这是否意味着他们不支持FileInfo 和 DirectoryInfo 这是他们的在 BCL(System.IO 命名空间(中。
-
我知道.NET中的传统文件和目录枚举很慢,我看过很多人们推荐的文章将 PInvoke 调用与 FindFirst(...( 一起使用FindNext(...( on Windows.我我完全知道这在 Linux 上不起作用。有没有人工作过在这个区域,特别是在Mono Linux上测试文件/目录枚举性能。
谢谢奥姆基
从技术上讲,它在Linux机器上应该更快,因为文件系统枚举通常比Windows快。
但是我们想根据自定义 Mono.Posix 评估 Mono BCL,我检查了两个程序集的基础实现,虽然两者都会在最后调用系统函数,但路由不同,因为前者使用 Mono 运行时抽象,但后者使用直接 p/invoke,所以我编写了一个简单的代码来评估目录和文件枚举的性能差异,这里是:
public static void Main (string[] args)
{
Assess ("/opt",5, false);
Console.WriteLine ("**********************");
Assess ("/opt",5, true);
}
public static void Assess (string root,int iteration, bool net=true)
{
var watch = new Stopwatch ();
var fCount = 0;
var dCount = 0;
watch.Start ();
for (var i=0; i<iteration; i++) {
if (net) {
Console.WriteLine ("assessing .Net Bcl");
var dirInfo = new System.IO.DirectoryInfo (root);
AssessNet (dirInfo, ref fCount, ref dCount);
} else {
Console.WriteLine ("assessing Mono Posix");
var unixDirInfo = new Mono.Unix.UnixDirectoryInfo (root);
AssessMono (unixDirInfo, ref fCount, ref dCount);
}
}
watch.Stop ();
Console.WriteLine ("crawl time: {0} ms", watch.ElapsedMilliseconds);
Console.WriteLine ("files count: {0}, directory count: {1}", fCount, dCount);
}
public static void AssessNet (System.IO.DirectoryInfo root, ref int fCount, ref int dCount)
{
var files = root.GetFiles ();
var dirs = root.GetDirectories ();
foreach (var f in files) {
fCount++;
}
foreach (var d in dirs) {
dCount++;
AssessNet (d, ref fCount, ref dCount);
}
}
public static void AssessMono (Mono.Unix.UnixDirectoryInfo root,ref int fCount,ref int dCount)
{
var entries = root.GetFileSystemEntries ();
foreach (var e in entries) {
if (e.IsDirectory) {
dCount++;
AssessMono (e as Mono.Unix.UnixDirectoryInfo,ref fCount,ref dCount);
} else {
fCount++;`enter code here`
}
}
}
}
我在 Ubuntu 3.2.8 上使用 Mono 14.04.1 64 位进行了测试
结果如下:
评估单声道波西斯
爬网时间: 469 毫秒,文件计数: 16020, 目录计数: 2965
评估 .Net Bcl
爬网时间:705 毫秒,文件计数: 16020, 目录计数: 2965
根据我的实验,存在性能差异,因此根据您的要求,并考虑到两个API之间的细微差异,编写精简包装器以在两个操作系统上获得最佳结果可能不是一个坏主意(我们可以在Windows上使用直接Win32调用,因为.Net中文件和目录IO的默认实现也很慢(。
我发现Mono设计了UnixDirectoryInfo,UnixFileInfo类 分别。我的问题是,这是否意味着他们不支持 FileInfo 和 DirectoryInfo 是它们在 BCL 中(System.IO 名称 空间(。
支持System.IO.FileInfo
和System.IO.DirectoryInfo
以及Mono.Unix.FileInfo
和Mono.Unix.DirectoryInfo
。因此,要编写可移植代码,我们应该使用System.IO
工具。编写了以下示例代码,它使用了System.IO
版本信息
MonoDevelop 3.1.0
Installation UUID: e5e69249-f5d5-40a6-9424-2ecbdf6c71c7
Runtime:
Mono 2.10.8.1 (Debian 2.10.8.1-1ubuntu2.2) (64-bit)
GTK 2.24.10
GTK# (2.12.0.0)
Build information:
Git revision: unknown
Build date: 2012-08-15 10:45:07+0000
Operating System:
Linux
Linux mantosh-Inspiron-3521 3.2.0-67-generic #101-Ubuntu S
MP Tue Jul 15 17:46:11 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
示例程序
using System;
using System.IO;
namespace Test
{
class DirInformation
{
static public void DoSomething ()
{
string name = null;
name = "/home/mantosh/";
DirectoryInfo info = new DirectoryInfo (name);
bool dirExists = info.Exists;
Console.WriteLine(dirExists);
}
public static void Main (string[] args)
{
DoSomething();
}
}
}
我完全知道这在 Linux 上不起作用。有没有人工作过 特别是在Mono Linux上测试文件/目录枚举 性能。
我认为我们应该编写示例应用程序并验证性能,而不是猜测。我没有对 MONO 进行任何性能分析,但通常与直接系统调用相比,任何框架/库代码都会慢一些。但是随着框架/库,我们得到了更好的错误处理,当然还有更可移植的代码。
我的建议是,如果你打算编写一个可移植的应用程序,你应该坚持使用框架(在本例中为 Mono(。