如何知道一个文件对象是否可读?注意,判断文件的硬盘属性是不能解决问题的,需要知道的是程序员在打开文件时是否使用了“CFile::modeRead”。
解决方案 »
- 那位大哥可以帮我做个dll,可以实现des加密和获取cpu的序列号! 方便在c#调用
- 用SDK的方式怎样查找出一个指定盘里的所有文件名????
- _wfopen打开文件的格式问题
- 一个奇怪的问题,有没有人踫过?
- 各位大侠,经纬度坐标怎么转化为直角坐标???
- OnEraseBkgnd()将背景设置了,可是打印预览中为何看不到???
- VC IDE的小问题
- InternetOpenURL这个函数怎么用呀!
- 各位大侠,小弟有几个很菜的问题请教
- 通过使用OS的API编写一个程序(求思路或者大概方法或者答案,菜鸟学习中)
- 特别的,CString的派生类不能调用CString的构造函数?怎么才能调用?
- 编一基于对话框的应用程序,此程序运行界面如下(图一),单击“确定”按钮后在编辑框中显示选择的复选按钮的结果。
to krh2001(边城浪子)
有时一读就抛出异常了,这方法好像...我需要的是ASSERT( 可读 );
读();
...
{
file.Read(...);
}
catch( CFileException& fe)
{
}
这样可能在判断是否可读时(如在ASSERT()中)就破坏了文件对象本身,有好些的方法吗?
你说的肯定不行。比如:
CFile file;
if( file.Open("Temp.Txt", CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite) )
{
file.Read(..) //肯定出错!!!
}
文件对象可能是从另一处传来的引用,理想的判断格式应该是:BOOL 可读吗?(const CFile & f) const;
读();
else
return; //报错等处理
{
file.Read(...);
}
catch( CFileException& fe)
{
// 报错
}// 如果没有读,到这里文件当前位置也不会变
其实我的意思是:
try
{
file.Read(...);
}
catch( CFileException& fe)
{
// 报错
}
这样的情况是 用户使用时发生的,而读没有用CFile::modeRead打开的文件是程序员的错!应该用ASSERT()故,异常 与 ASSERT() 不应该随意替换使用。
ASSERT( 文件可读吗()? ); //如果可读才能通过,但是如果真的可读并且通过,也不能修改引用的文件对象;如果不能通过,也不能把其他(除了没有写CFile::modeRead之外的其他)错误捕获,因为这会造成调试版和发布版的混乱。
//第二步
进行真正的读操作();
……理论上,每一个文件句柄都在创建时输入了 CFile::modeRead意义 的一些参数,并且当访问权限不足时都会报错,故系统内部的实现中一定还保存着 CFile::modeRead意义 的信息,所以,我希望的功能有可能实现。请高手指点!
--------------------------------
这句本身就有问题. 文件可不可读不应该用来断言的. 如果调试版有这个需要,那么发行版也应该有这个需要. ASSERT 不是用来断言这些不确定的东西的
The GetFileAttributes function returns attributes for a specified file or directory. DWORD GetFileAttributes(
LPCTSTR lpFileName // pointer to the name of a file or directory
);也可以完成你要的功能,为什么要断章取义
先不要这么急,你需要首先看清楚题目:顶楼:如何知道一个文件 对象 是否可读?在VC6、7、C++语言中对象指 实例、实体、抽象数据类型(类)的实例化。“注意,判断文件的硬盘属性是不能解决问题的”//因为文件对象假如以“CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite”方式打开,即使你调用GetFileAttributes得知文件的硬盘存在仍然是可读、可共享读的,但是此时 文件对象 仍然是不可读,所以有了 注意 这2个字。所以我在6楼提出例子:CFile file;
if( file.Open("Temp.Txt", CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite) )
{
file.Read(..) //肯定出错!!!
}
ASSERT( 文件可读吗()? );
--------------------------------
这句本身就有问题. 文件可不可读不应该用来断言的. 如果调试版有这个需要,那么发行版也应该有这个需要. ASSERT 不是用来断言这些不确定的东西的---------------------
你真很会断章取义,看清楚我那层楼写什么:回复人: hai_feng(海风) ( ) 信誉:100 2005-05-05 20:26:00
to surstar(断水流) 、大家我需要的是://首先
ASSERT( 文件可读吗()? ); //如果可读才能通过,但是如果真的可读并且通过,也不能修改引用的文件对象;//很清楚明确是 引用 ,也就是 对象 的引用顶楼主题:
主 题: 如何知道一个文件对象是否可读? //注意清楚是 “对象”----------------------------
1、在VC版,最起码要知道什么是对象 //允许看漏眼。-->“如果调试版有这个需要,那么发行版也应该有这个需要”
2、在MFC版,最起码要知道MFC使用率最高的宏 ASSERT() 是什么 //ASSERT()从来就是调试版有需要发行版无需要的东西。 //这是大脑中的任何推理的默认前提3、这里的回贴全部不能修改,断章取义毫无好处和意义。//不过你帮我up了我还是应该给分你
catch( CFileException* fe)
{
switch(fe->m_case)
{
case CFileException::accessDenied: //不知道这个异常能不能,
break;
}
}
try
{
file.Read(...);
}
catch( CFileException& fe)
{
// 报错
}
这样的情况是 用户使用时发生的,而读没有用CFile::modeRead打开的文件是程序员的错!应该用ASSERT()故,异常 与 ASSERT() 不应该随意替换使用。
------------------------------------------------------------to 楼主: 你这种说法完全不对. 如果只是防止程序员用错,那么根本不用什么 ASSERT!因为你一旦对某个不可读的文件进行读操作就会产生异常, 这个跟ASSERT 根本就是同样的道理,我不相信对于这样明显的故障,还会有哪个程序员会不去注意,一定要ASSERT ? 楼主说不要读文件,而一定要断言该文件可读,那么请问,如果你始终都不需要对该文件进行读操作,那么判断此文件是不是可读有什么意义? 如果确实要读该文件,那么,读的时候就一定可以调试出来.所以无论怎么样,都不需要ASSERT(file_is_read_able).
被你的问法搞糊涂了
--------------enum OpenFlags {
modeRead = 0x0000,
modeWrite = 0x0001,
modeReadWrite = 0x0002,
shareCompat = 0x0000,
shareExclusive = 0x0010,
shareDenyWrite = 0x0020,
shareDenyRead = 0x0030,
shareDenyNone = 0x0040,
modeNoInherit = 0x0080,
modeCreate = 0x1000,
modeNoTruncate = 0x2000,
typeText = 0x4000, // typeText and typeBinary are used in
typeBinary = (int)0x8000 // derived classes only
};
不知道这个能不能判断 程序员打开文件时是否使用了“CFile::modeRead”。
你是不是想知道那个文件是否可读,如果你知道那个文件的路径,你就 用只读方式读下试试bool bCanRead=true;
try{
//open
//read
//close
}
atch( CFileException& fe)
{
bCanRead=false;
}
if(bCanRead){
//------------------
}
else{
//------------------
}////////////// 不要吵架 、//////////