ADSdotNET: 一个用于从 .NET 语言使用备用数据流的 DLL






4.14/5 (5投票s)
使用此类,您可以从 C#、VB.NET 和其他 .NET 语言使用 ADS,而无需 P/Invoke。
引言
ADSdotNET 是一个库,它使 C# 或 Visual Basic .NET 等基于 .NET 的编程语言能够访问备用数据流 (ADS)。没有这个 DLL,将需要使用 P/Invoke 或 C++/CLI 来处理 ADS 并同时受益于基于 .NET 的语言。
顺便说一句,ADSdotNET 是用 C++/CLI 开发的。zip 文件 adsdotnet-0.2-src.zip 包含一个 Visual Studio 2005 项目。其他 zip 文件(adsdotnet-0.2-bin-x86.zip 和 adsdotnet-0.2-bin-x64.zip)仅包含编译后的 DLL。
背景
当我尝试从我的 C# 代码访问 ADS 时,我发现 .NET 框架目前不支持文件流。所以我决定编写一个类,我可以在我的 C# 项目中使用。我决定使用 C++/CLI 编写 ADSdotNET,因为在我看来,使用这种语言访问 Windows API 比使用 P/Invoke 更“自然”。
Using the Code
在将 DLL 作为引用添加到 Visual Studio 项目后(您可以在解决方案资源管理器中执行此操作),您将在“引用”文件夹下看到一个名为 ADSdotNET
的新条目。
从现在开始,您可以使用一个名为 AdsDotNet
的新命名空间。它包含 AdsHandler
类。首先,您必须创建这个类的一个对象。AdsHandler
类型的每个对象都指向一个文件或目录。这些对象的方法可用于添加/删除/修改相应文件或目录的备用数据流(将来将称为“根对象”)。备用数据流可以附加到根对象。
现在我将描述 AdsHandler
类的方法。示例将有助于理解用法(我希望)。
所有 AdsHandler
方法概览
AdsHandler::AdsHandler
AdsHandler::AddAds
AdsHandler::DeleteAds
AdsHandler::AdsExists
AdsHandler::GetAdsList
AdsHandler::OpenAds
AdsHandler::AdsIsOpen
AdsHandler::CloseAds
AdsHandler::GetCompleteFilename
构造函数
创建一个新的 AdsHandler
类型的对象,该对象表示可以在其上执行 ADS 操作的文件或文件夹。
C++/CLI 声明
AdsHandler(String ^filename);
参数
filename
:现有文件或文件夹的名称(= 根对象的名称)
示例 1
AdsManager adsman = new AdsManager("C:\\texts\\textfile.txt");
示例 2
AdsManager adsman = new AdsManager("C:\\texts");
注意
通过传递一个空的 string
- new AdsManager("");
- 将会抛出 CommandNotAllowedException
。如果根对象不存在,将抛出 FileNotFoundException
。
AddAds
向根对象添加一个空的 ADS。
C++/CLI 声明
void AddAds(String ^adsname);
参数
adsname
:要创建的 ADS 的名称。
示例
adsman.AddAds("my_stream");
注意
通过传递一个空的 string
- adsman.AddAds("");
– 将会抛出 CommandNotAllowedException
。如果已存在同名的 ADS,则什么也不发生。
DeleteAds
从根对象中移除(删除)一个 ADS。
C++/CLI 声明
void DeleteAds(String ^adsname);
参数
adsname
:要删除的 ADS 的名称。
示例
adsman.AddAds("my_stream");
注意
通过传递一个空的 string
- adsman.AddAds("");
-,如果根对象是一个文件,则将删除根对象及其所有 ADS。否则将抛出 WinAPIException
。
AdsExists
如果某个 ADS 存在,则返回 true
,否则返回 false
。
C++/CLI 声明
bool AdsExists(String ^adsname);
参数
adsname
:将检查具有此名称的 ADS 的存在性。
示例
if(adsman.AdsExists("stream334")) { ... }
注意
通过传递一个空的 string
- adsman.AdsExists("");
-,该方法将检查根对象是否存在。
GetAdsList
返回附加到根对象的所有 ADS 名称的列表。
C++/CLI 声明
System::Collections::Generic::List<System::String^> ^GetAdsList();
示例
List<String> adslist = adsman.GetAdsList();
OpenAds
打开一个 ADS 以供读取/写入。将返回一个 FileStream
对象,以便您可以像处理普通文件一样处理 ADS。
C++/CLI 声明
System::IO::FileStream ^OpenAds(String ^adsname);
参数
adsname
:要打开的 ADS 的名称。
示例
AdsHandler adsman_folder = new AdsHandler("testfolder");
adsman_folder.AddAds("asd");
System.IO.FileStream fs = adsman_folder.OpenAds("asd");
System.IO.StreamWriter sw = new System.IO.StreamWriter(fs);
sw.WriteLine("Hello ADS!");
sw.Close();
adsman_folder.CloseAds("asd");
注意
如果 stream
不存在,将抛出 StreamNotFoundException
。通过传递一个空的 string
,将返回一个指向根文件的 FileStream
。如果根对象不是文件,将抛出 WinAPIException
。FileStream
将在 CloseAds
方法中关闭。因此,您不必调用 fs.Close()
。
AdsIsOpen
如果具有指定名称的 ADS 当前已打开,则返回 true
,否则返回 false
。stream
必须使用 OpenAds
方法打开。因此,AdsIsOpened
仅在调用 OpenAds
和 CloseAds
之间返回 true
(即使 FileStream
在调用 CloseAds
方法之前已手动使用 fs.Close()
关闭)。
C++/CLI 声明
bool AdsIsOpened(String ^adsname);
参数
adsname
:一个 stream
名称。
示例
if (adsman_folder.AdsIsOpened("stream")) { ... }
CloseAds
关闭之前由 OpenAds
打开的 ADS。通过调用此方法将关闭 OpenAds
提供的 FileStream
。
C++/CLI 声明
void CloseAds(String ^adsname);
参数
adsname
:一个已打开 ADS 的名称。
示例
(请参阅 OpenAds
)
GetCompleteFilename
根据文件名和 stream
名称构建一个名称,例如 X:\path\file.txt:streamname
或 X:\path:streamname
。
C++/CLI 声明
System::String ^GetCompleteFilename(String ^adsname);
参数
adsname
:将用作 stream
名称的名称。
示例
string filename = adsman.GetCompleteFilename("stream");
注意
具有指定名称的 stream
不必存在。
更多资源
在 http://www.mickbitsoftware.com/de/adsdotnet,您可以下载一个 PDF 文件,其中包含您上面看到的文本的德语版本。
AdsManager
是一个用 C# 编写的应用程序,它使用 ADSdotNET。您可以从 http://www.mickbitsoftware.com/en/adsmanager 下载二进制文件。目前,我不提供 AdsManager 的源代码。