有了这样的编号,那么当插入光盘的时候就可以进行判断了,如果是新光盘(数据库中没有的)那么就创建记录、检索光盘内容,如果是旧光盘(数据库中已有的),那么就不检索内容,如果是旧的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;
}
以前的代码,自己修改。
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);
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类型,根据此一信息,对不同的光盘类型采用不同的操作)
各位觉得如何?
这几天由于工作调动的关系
没有能够及时回复
真是抱歉
我会努力尝试各位提供的方法
尤其是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;
}
以前的代码,自己修改。
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);
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类型,根据此一信息,对不同的光盘类型采用不同的操作)
各位觉得如何?
这几天由于工作调动的关系
没有能够及时回复
真是抱歉
我会努力尝试各位提供的方法
尤其是CityHost兄提供的方法(只是我总觉得你的方法好像是针对光驱的,而不是针对光盘的说)。
这里向各位交流一下我的想法(其实也不是什么新方法,和nobill兄和xiaoshi0兄的方法类似),该方法将根据光盘上根目录下的文件名、文件创建/刻录日期时间和光盘总文件大小作为参考信息来产生一个唯一编号。
之所以会选择这三个信息,主要是考虑到有时候光盘的Lable会是一样的,而这样基本上就不会有重复的可能性了,而缺点就是:如果是CDR/CDRW的话,那么产生一个新的光盘编号,这样就又会造成光盘数据库的资料冗余。
如果光盘上有唯一序列号的话,那么不管这张光盘怎么改变内容,我们还是可以让程序盯住这张光盘的说。
而一个补救的方法就是在添加光盘的时候要求提供光盘类型(基本上就是CD类型,根据此一信息,对不同的光盘类型采用不同的操作)
各位觉得如何?
#8
看来没有更多人对此感兴趣了
唉…………
结帖吧
唉…………
结帖吧