65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.14/5 (5投票s)

2008年11月21日

CPOL

4分钟阅读

viewsIcon

41592

downloadIcon

1041

使用此类,您可以从 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 类型的对象,该对象表示可以在其上执行 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:streamnameX:\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 的源代码。

© . All rights reserved.