请教:如何判断插入的是哪一张光盘?

时间:2022-01-03 16:44:29
做光盘管理程序的时候,想给每一张光盘一个唯一的编号,请问该怎样去实现这个编号?光盘上有没有类似硬件的那种序列号?或者可以有其他方法生成这样的唯一的编号?
有了这样的编号,那么当插入光盘的时候就可以进行判断了,如果是新光盘(数据库中没有的)那么就创建记录、检索光盘内容,如果是旧光盘(数据库中已有的),那么就不检索内容,如果是旧的CDRW光盘那么就检查是否有更新,如果有,那么就同样更新数据库中的记录。

谢谢先。
分不够可以加,我这里最高能够追加到100分。

8 个解决方案

#1


如果是自己刻的可以啊,用卷序列号。好象空白光盘没有号的吧

#2


char volname[255],filename[100];//buffer[512];
           DWORD sno,maxl,fileflag ;
           if (!(GetVolumeInformation(AnsiString(CDRom+":").c_str(),volname,255,&sno,&maxl,&fileflag,filename,100)))
           {
              MessageDlg("请将光盘插入光驱!",mtError,TMsgDlgButtons()<<mbYes,0);
              return;
           }

            TSearchRec sr;
            AnsiString newfile;
            int i=0;
            iTuPian=0;
            MaxTuPian=0;

            for(int j=0;j<100;j++)
            {
              str[j]="";
            }

            if(FindFirst(Path+"*.*",0x10,sr)==0)
            {
              while(1)
              {
                if((sr.Attr&faDirectory)==0)   //判断是不是文件
                //if ((sr.Attr&faDirectory)!=0 && sr.Name!="." && sr.Name!="..")判断是不是文件夹

                {

                  str[i]=Path+sr.Name;
                  i++;
                  MaxTuPian++;
                  //str="d:\\c\\"+str;

                }
                if(FindNext(sr)!=0) break;
              }
              FindClose(sr);
            }
           if(str[0]=="")
           {
             MessageBox(NULL,"请将正确的光盘放入光区!", "提示!", MB_ICONINFORMATION);
             return;
           }

以前的代码,自己修改。

#3


收藏

#4


如果光盘中的内容已经固定了,可以通过判断盘中固定文件的文件名的方法,如果不是固定的,则可以在制作光盘的时候为光盘指定序列号,然后在程序中检查序列号就可以了

#5


学习

#6


这种方法可不可以:
INCLUDE头文件:ntddcdrm.h(NTDDK开发包) winioctl.h Mmreg.h
1、搜索光驱
我们可以用GetDriveType来判断设备类型,5为CDROM类型。返回类型可以参看MSDN,里面有详细介绍。

2、打开设备
用CreateFile获得设备句柄
    HANDLE m_hDevice;
    AnsiString FileName=”F:”;
    m_hDevice =CreateFile("\\\\.\\"+FileName.c_str(),                // 文件名路径
    GENERIC_READ,                                            // 读写方式
    FILE_SHARE_READ | FILE_SHARE_WRITE,                      // 共享方式
    NULL,                                                    // 默认的安全描述符
    OPEN_EXISTING,                                           // 创建方式
    0,                                                       // 不需设置文件属性
    NULL);                                                   // 不需参照模板文件


3、读取CD参数
得到了设备句柄,我们就可以用DeviceIoControl来获息相关信息.
DeviceIoControl函数原型:     BOOL DeviceIoControl(
    HANDLE hDevice,                                 // 设备句柄
    DWORD dwIoControlCode,                          // 控制码
    LPVOID lpInBuffer,                              // 输入数据缓冲区指针
    DWORD nInBufferSize,                           // 输入数据缓冲区长度
    LPVOID lpOutBuffer,                             // 输出数据缓冲区指针
    DWORD nOutBufferSize,                          // 输出数据缓冲区长度
    LPDWORD lpBytesReturned,                        // 输出数据实际长度单元长度
    LPOVERLAPPED lpOverlapped                      // 重叠操作结构指针
    );

4、使用IOCTL_CDROM_READ_TOC控制码输出CDROM_TOC结构 

  BOOL bResult;
  DWORD dwOutBytes;
  CDROM_TOC CdromTOC;     //table of contents of the media信息结构,详细请看MSDN
  bResult=DeviceIoControl(m_hDevice,
   IOCTL_CDROM_READ_TOC,NULL,0,
   &CdromTOC,
   sizeof(CdromTOC),
   &dwOutBytes,  
   (LPOVERLAPPED)NULL);

#7


感谢大家的指点
这几天由于工作调动的关系
没有能够及时回复
真是抱歉

我会努力尝试各位提供的方法
尤其是CityHost兄提供的方法(只是我总觉得你的方法好像是针对光驱的,而不是针对光盘的说)。

这里向各位交流一下我的想法(其实也不是什么新方法,和nobill兄和xiaoshi0兄的方法类似),该方法将根据光盘上根目录下的文件名、文件创建/刻录日期时间和光盘总文件大小作为参考信息来产生一个唯一编号。
之所以会选择这三个信息,主要是考虑到有时候光盘的Lable会是一样的,而这样基本上就不会有重复的可能性了,而缺点就是:如果是CDR/CDRW的话,那么产生一个新的光盘编号,这样就又会造成光盘数据库的资料冗余。

如果光盘上有唯一序列号的话,那么不管这张光盘怎么改变内容,我们还是可以让程序盯住这张光盘的说。
而一个补救的方法就是在添加光盘的时候要求提供光盘类型(基本上就是CD类型,根据此一信息,对不同的光盘类型采用不同的操作)

各位觉得如何?

#8


看来没有更多人对此感兴趣了
唉…………
结帖吧

#1


如果是自己刻的可以啊,用卷序列号。好象空白光盘没有号的吧

#2


char volname[255],filename[100];//buffer[512];
           DWORD sno,maxl,fileflag ;
           if (!(GetVolumeInformation(AnsiString(CDRom+":").c_str(),volname,255,&sno,&maxl,&fileflag,filename,100)))
           {
              MessageDlg("请将光盘插入光驱!",mtError,TMsgDlgButtons()<<mbYes,0);
              return;
           }

            TSearchRec sr;
            AnsiString newfile;
            int i=0;
            iTuPian=0;
            MaxTuPian=0;

            for(int j=0;j<100;j++)
            {
              str[j]="";
            }

            if(FindFirst(Path+"*.*",0x10,sr)==0)
            {
              while(1)
              {
                if((sr.Attr&faDirectory)==0)   //判断是不是文件
                //if ((sr.Attr&faDirectory)!=0 && sr.Name!="." && sr.Name!="..")判断是不是文件夹

                {

                  str[i]=Path+sr.Name;
                  i++;
                  MaxTuPian++;
                  //str="d:\\c\\"+str;

                }
                if(FindNext(sr)!=0) break;
              }
              FindClose(sr);
            }
           if(str[0]=="")
           {
             MessageBox(NULL,"请将正确的光盘放入光区!", "提示!", MB_ICONINFORMATION);
             return;
           }

以前的代码,自己修改。

#3


收藏

#4


如果光盘中的内容已经固定了,可以通过判断盘中固定文件的文件名的方法,如果不是固定的,则可以在制作光盘的时候为光盘指定序列号,然后在程序中检查序列号就可以了

#5


学习

#6


这种方法可不可以:
INCLUDE头文件:ntddcdrm.h(NTDDK开发包) winioctl.h Mmreg.h
1、搜索光驱
我们可以用GetDriveType来判断设备类型,5为CDROM类型。返回类型可以参看MSDN,里面有详细介绍。

2、打开设备
用CreateFile获得设备句柄
    HANDLE m_hDevice;
    AnsiString FileName=”F:”;
    m_hDevice =CreateFile("\\\\.\\"+FileName.c_str(),                // 文件名路径
    GENERIC_READ,                                            // 读写方式
    FILE_SHARE_READ | FILE_SHARE_WRITE,                      // 共享方式
    NULL,                                                    // 默认的安全描述符
    OPEN_EXISTING,                                           // 创建方式
    0,                                                       // 不需设置文件属性
    NULL);                                                   // 不需参照模板文件


3、读取CD参数
得到了设备句柄,我们就可以用DeviceIoControl来获息相关信息.
DeviceIoControl函数原型:     BOOL DeviceIoControl(
    HANDLE hDevice,                                 // 设备句柄
    DWORD dwIoControlCode,                          // 控制码
    LPVOID lpInBuffer,                              // 输入数据缓冲区指针
    DWORD nInBufferSize,                           // 输入数据缓冲区长度
    LPVOID lpOutBuffer,                             // 输出数据缓冲区指针
    DWORD nOutBufferSize,                          // 输出数据缓冲区长度
    LPDWORD lpBytesReturned,                        // 输出数据实际长度单元长度
    LPOVERLAPPED lpOverlapped                      // 重叠操作结构指针
    );

4、使用IOCTL_CDROM_READ_TOC控制码输出CDROM_TOC结构 

  BOOL bResult;
  DWORD dwOutBytes;
  CDROM_TOC CdromTOC;     //table of contents of the media信息结构,详细请看MSDN
  bResult=DeviceIoControl(m_hDevice,
   IOCTL_CDROM_READ_TOC,NULL,0,
   &CdromTOC,
   sizeof(CdromTOC),
   &dwOutBytes,  
   (LPOVERLAPPED)NULL);

#7


感谢大家的指点
这几天由于工作调动的关系
没有能够及时回复
真是抱歉

我会努力尝试各位提供的方法
尤其是CityHost兄提供的方法(只是我总觉得你的方法好像是针对光驱的,而不是针对光盘的说)。

这里向各位交流一下我的想法(其实也不是什么新方法,和nobill兄和xiaoshi0兄的方法类似),该方法将根据光盘上根目录下的文件名、文件创建/刻录日期时间和光盘总文件大小作为参考信息来产生一个唯一编号。
之所以会选择这三个信息,主要是考虑到有时候光盘的Lable会是一样的,而这样基本上就不会有重复的可能性了,而缺点就是:如果是CDR/CDRW的话,那么产生一个新的光盘编号,这样就又会造成光盘数据库的资料冗余。

如果光盘上有唯一序列号的话,那么不管这张光盘怎么改变内容,我们还是可以让程序盯住这张光盘的说。
而一个补救的方法就是在添加光盘的时候要求提供光盘类型(基本上就是CD类型,根据此一信息,对不同的光盘类型采用不同的操作)

各位觉得如何?

#8


看来没有更多人对此感兴趣了
唉…………
结帖吧