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

CD/DVD 索引器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.45/5 (8投票s)

2006年3月24日

CPOL

2分钟阅读

viewsIcon

38824

downloadIcon

482

将 CD/DVD 文件属性保存到电脑

Sample Image - dvdindexer.png

引言

多年来,我一直将文件备份到 CD 上,我发现我记不住哪个 CD 存放了什么文件,所以不得不选择一些可疑的 CD 并搜索我的文件!这个程序可以将 CD/DVD 文件属性保存到电脑上,这样当我想要搜索文件时,我就不必搜索每个 CD 了。我所需要做的就是输入关键字并点击“搜索”按钮来搜索指定的文件。代码的实现方式如下:

  1. 获取和保存数据
    1. 获取所有文件名及其主要属性和目录
    2. 将这些数据保存到 DireNode FileNode 对象中
    3. 将数据序列化到流中
    4. 压缩序列化的流并将其保存到文件中
  2. 检索数据
    1. 解压缩数据
    2. 反序列化数据并将其链接到树形视图控件
  3. 搜索循环遍历指定目录中的所有文件
    1. 解压缩数据
    2. 反序列化数据
    3. 使用关键字搜索,如果找到则在树形视图中显示结果

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;
            }
        }

关注点

重要的内容是上述这些方法和两个类定义。其他重要内容是 SaveRetrieveFind SearchAll 方法。

项目中的代码比我的文字更具描述性(我想),因为这是我的第一篇文章。
我期待您的反馈。
就这些了。
希望您喜欢这段代码。

历史

  • 2006 年 3 月 24 日:初始发布
© . All rights reserved.