CD/DVD 索引器






3.45/5 (8投票s)
将 CD/DVD 文件属性保存到电脑

引言
多年来,我一直将文件备份到 CD 上,我发现我记不住哪个 CD 存放了什么文件,所以不得不选择一些可疑的 CD 并搜索我的文件!这个程序可以将 CD/DVD 文件属性保存到电脑上,这样当我想要搜索文件时,我就不必搜索每个 CD 了。我所需要做的就是输入关键字并点击“搜索”按钮来搜索指定的文件。代码的实现方式如下:
- 获取和保存数据
- 获取所有文件名及其主要属性和目录
- 将这些数据保存到
DireNode
和FileNode
对象中 - 将数据序列化到流中
- 压缩序列化的流并将其保存到文件中
- 检索数据
- 解压缩数据
- 反序列化数据并将其链接到树形视图控件
- 搜索循环遍历指定目录中的所有文件
- 解压缩数据
- 反序列化数据
- 使用关键字搜索,如果找到则在树形视图中显示结果
Using the Code
使用代码
// Define these variables
BuildSaveAndRetrieve bsr;
bool search;
使用此方法构建文件。
- 第一个参数是选择的 DVD 驱动器
- 第二个参数是保存数据的完整文件名
bsr.Build(drivename, fileName);
加载节点
bsr.LoadNodes(fileName, out initNode);
- 第一个参数是保存所需数据的文件名
- 第二个参数是检索数据的树形节点
要在目录中搜索关键字,第一个参数是数据文件的 location
,第二个参数是 keyword
bsr.SearchAll(location, keyword);
在指定的节点中查找关键字
bsr.Find(key, currDirNode);
您还可以使用压缩和解压缩。例如 (解)压缩,(解)序列化
//decompression
public Stream DeflateDecompress(string fileName)
{
try
{
FileStream fs= new FileStream(fileName, FileMode.Open,
FileAccess.Read, FileShare.None);
return (new DeflateStream(fs, CompressionMode.Decompress));
}
catch (Exception e)
{
ErrorMessage(e.Message);
return null;
}
}
//Compression & test
public bool DeflateCompress(Stream ms, string fileName)
{
try
{
byte[] buffer = new byte[ms.Length];
ms.Position = 0;
if ((ms.Read(buffer, 0, buffer.Length)) != ms.Length)
{
ErrorMessage("Unable to read data from memory");
return false;
}
ms.Close();
FileStream fs = new FileStream(fileName, FileMode.Create,
FileAccess.Write, FileShare.None);
DeflateStream compressedzipStream = new DeflateStream
(fs, CompressionMode.Compress, true);
compressedzipStream.Write(buffer, 0, buffer.Length);
compressedzipStream.Close();
fs.Close();
fs = new FileStream(fileName, FileMode.Open);
DeflateStream zipStream = new DeflateStream
(fs, CompressionMode.Decompress);
if (!TestData(buffer, zipStream))
{
zipStream.Close();
return false;
}
else
{
zipStream.Close();
return true;
}
}
catch (Exception e)
{
ErrorMessage(e.Message);
return false;
}
}
//Test
public static bool TestData(byte[] bufferSrc, Stream decompressed)
{
int bufferSrcLength = bufferSrc.Length;
int decompressedStreamLength = 0;
byte[] buffer = new byte[bufferSrcLength];
decompressedStreamLength = decompressed.Read(buffer, 0, bufferSrcLength);
if (decompressedStreamLength != bufferSrcLength)
return false;
for (int i = 0; i < decompressedStreamLength; i++)
{
if (bufferSrc[i] != buffer[i])
return false;
}
return true;
}
//Serialization
private Stream SerializeNodes(string fileName, DirNode rootCDDVDDir)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, rootCDDVDDir);
return ms;
}
//Deserialization
private static DirNode DeserializeNodes(Stream s)
{
BinaryFormatter bf = new BinaryFormatter();
try
{
DirNode retrievedRootDirNode = (DirNode)bf.Deserialize(s);
s.Close();
return retrievedRootDirNode;
}
catch (Exception e)
{
ErrorMessage(e.Message);
s.Close();
return null;
}
}
关注点
重要的内容是上述这些方法和两个类定义。其他重要内容是 Save
、Retrieve
、Find
和 SearchAll
方法。
项目中的代码比我的文字更具描述性(我想),因为这是我的第一篇文章。
我期待您的反馈。
就这些了。
希望您喜欢这段代码。
历史
- 2006 年 3 月 24 日:初始发布