如何知道一个文件对象是否可读?注意,判断文件的硬盘属性是不能解决问题的,需要知道的是程序员在打开文件时是否使用了“CFile::modeRead”。

解决方案 »

  1.   


    to krh2001(边城浪子) 
    有时一读就抛出异常了,这方法好像...我需要的是ASSERT( 可读 );
    读();
    ...
      

  2.   

    try
    {
        file.Read(...);
    }
    catch( CFileException& fe)
    {
    }
      

  3.   

    读了后,当前指针会变,但如果还抛出了异常,不知道这个文件对象还是否可用?
    这样可能在判断是否可读时(如在ASSERT()中)就破坏了文件对象本身,有好些的方法吗?
      

  4.   

    File.getAttributesRetrieves the attributes for the specified file or directory. Syntaxpublic static int getAttributes( String path )Parameterspath The path of a file or directory. Return ValueReturns the attributes of the file or directory. ExceptionsWinIOException thrown if an error occurs. ResThe return value is a combination of the ARCHIVE, COMPRESSED, DIRECTORY, HIDDEN, OFFLINE, READONLY, SYSTEM, and TEMPORARY FileAttribute flags. See Also   setAttributes 
      

  5.   

    to legendhui(何离心之可同兮,吾将远逝以自疏)
    你说的肯定不行。比如:
    CFile file;
    if( file.Open("Temp.Txt", CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite) )
    {
    file.Read(..) //肯定出错!!!
    }
      

  6.   


    文件对象可能是从另一处传来的引用,理想的判断格式应该是:BOOL 可读吗?(const CFile & f) const;
      

  7.   

    if( 可读吗?() )
    读();
    else
    return; //报错等处理
      

  8.   

    不要钻牛角尖. try...catch... 就可以了. 如果读时发生了异常,说明不可读,那就没必要再做什么发象你那样,报错就行了,有什么不可以?try
    {
        file.Read(...);
    }
    catch( CFileException& fe)
    {
       //  报错
    }// 如果没有读,到这里文件当前位置也不会变
      

  9.   

    to krh2001(边城浪子)如果发生了异常,怎么知道文件对象还有用否?BOOL 可读吗?(const CFile & f) const; //这里传入的假如是一个外部还在使用的、还要写入的文件
      

  10.   


    其实我的意思是:
    try
    {
        file.Read(...);
    }
    catch( CFileException& fe)
    {
       //  报错
    }
    这样的情况是 用户使用时发生的,而读没有用CFile::modeRead打开的文件是程序员的错!应该用ASSERT()故,异常 与 ASSERT() 不应该随意替换使用。
      

  11.   

    你想知道是 一个文件是否有程序在使用它吧,而不是改文件 是否是具有readonly 属性?
      

  12.   

    to surstar(断水流) 、大家我需要的是://首先
    ASSERT( 文件可读吗()? ); //如果可读才能通过,但是如果真的可读并且通过,也不能修改引用的文件对象;如果不能通过,也不能把其他(除了没有写CFile::modeRead之外的其他)错误捕获,因为这会造成调试版和发布版的混乱。
    //第二步
    进行真正的读操作();
    ……理论上,每一个文件句柄都在创建时输入了 CFile::modeRead意义 的一些参数,并且当访问权限不足时都会报错,故系统内部的实现中一定还保存着 CFile::modeRead意义 的信息,所以,我希望的功能有可能实现。请高手指点!
      

  13.   

    ASSERT( 文件可读吗()? );  
    --------------------------------
    这句本身就有问题.  文件可不可读不应该用来断言的. 如果调试版有这个需要,那么发行版也应该有这个需要. ASSERT 不是用来断言这些不确定的东西的
      

  14.   

    GetFileAttribute()//如果我没拼错的话,就是用这个函数来获取文件的属性的
      

  15.   

    hai_feng(海风) ( ) 信誉:100大哥,你首先看清楚我写的是什么我没有让你读文件,File.getAttributes是file.Read(..)吗?如果我是文盲的话!
      

  16.   

    GetFileAttributes
    The GetFileAttributes function returns attributes for a specified file or directory. DWORD GetFileAttributes(
      LPCTSTR lpFileName   // pointer to the name of a file or directory
    );也可以完成你要的功能,为什么要断章取义
      

  17.   

    to legendhui(何离心之可同兮,吾将远逝以自疏)
    先不要这么急,你需要首先看清楚题目:顶楼:如何知道一个文件  对象  是否可读?在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(..) //肯定出错!!!
    }
      

  18.   

    to krh2001(边城浪子)
        ASSERT( 文件可读吗()? );  
        --------------------------------
        这句本身就有问题.  文件可不可读不应该用来断言的. 如果调试版有这个需要,那么发行版也应该有这个需要. ASSERT 不是用来断言这些不确定的东西的---------------------
    你真很会断章取义,看清楚我那层楼写什么:回复人: hai_feng(海风) ( ) 信誉:100  2005-05-05 20:26:00 
    to surstar(断水流) 、大家我需要的是://首先
    ASSERT( 文件可读吗()? ); //如果可读才能通过,但是如果真的可读并且通过,也不能修改引用的文件对象;//很清楚明确是 引用 ,也就是 对象 的引用顶楼主题:
    主  题:  如何知道一个文件对象是否可读?  //注意清楚是 “对象”----------------------------
    1、在VC版,最起码要知道什么是对象 //允许看漏眼。-->“如果调试版有这个需要,那么发行版也应该有这个需要”
    2、在MFC版,最起码要知道MFC使用率最高的宏 ASSERT() 是什么 //ASSERT()从来就是调试版有需要发行版无需要的东西。 //这是大脑中的任何推理的默认前提3、这里的回贴全部不能修改,断章取义毫无好处和意义。//不过你帮我up了我还是应该给分你
      

  19.   


    catch( CFileException* fe)
    {
       switch(fe->m_case)
       {
           case CFileException::accessDenied:  //不知道这个异常能不能,
            break;
       }
    }
      

  20.   

    其实我的意思是:
    try
    {
        file.Read(...);
    }
    catch( CFileException& fe)
    {
       //  报错
    }
    这样的情况是 用户使用时发生的,而读没有用CFile::modeRead打开的文件是程序员的错!应该用ASSERT()故,异常 与 ASSERT() 不应该随意替换使用。
    ------------------------------------------------------------to 楼主: 你这种说法完全不对. 如果只是防止程序员用错,那么根本不用什么 ASSERT!因为你一旦对某个不可读的文件进行读操作就会产生异常, 这个跟ASSERT 根本就是同样的道理,我不相信对于这样明显的故障,还会有哪个程序员会不去注意,一定要ASSERT ? 楼主说不要读文件,而一定要断言该文件可读,那么请问,如果你始终都不需要对该文件进行读操作,那么判断此文件是不是可读有什么意义? 如果确实要读该文件,那么,读的时候就一定可以调试出来.所以无论怎么样,都不需要ASSERT(file_is_read_able).
      

  21.   

    ASSERT() 与 异常 根本就是2个不同的概念,异常还有调用层次的控制权转移等多种用途、处理模式、逻辑格局、效率考虑等。而ASSERT是调试版和发布版被编译器不同处理的。这是最基础的知识。不用异常代替ASSERT(),但不是叫你用不操作来代替有操作,这根本谈不上。如果你真的要做破坏性的操作,只要你有能力把破坏了的东西完全恢复你就算是没有破坏它了,否则随意破坏你将付出代价。
      

  22.   

    ----------------------------
    被你的问法搞糊涂了
    --------------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{
     //------------------
    }//////////////           不要吵架       、//////////
      

  23.   

    Mark.先打开,试读一下?再将文件的“游标”打向文件首.不知对否?