Excel操作Bug引出的问题:如何判断文件是否被占用、打开

方法一:_sopen()

:具体函数描述sopen()

int _sopen(const char *filename,  int oflag,  int shflag [, int pmode ]);

参数:filename 文件名 oflag 允许的操作类型 shflag 允许的共享类型 pmode 权限设置。
返回值 : 其中每个函数都将为打开的文件返回文件描述符。
如果 filename 或 oflag 是 NULL 指针,或者如果 oflag 或 shflag 不在有效值范围内,则调用的参数处理程序无效,如参数验证中所述。 如果允许执行继续,则这些函数将返回 -1 并将 errno 设置为以下值之一。
EACCES 给定路径是目录,或者文件是只读的,但是已尝试打开以供写入操作。
EEXIST 已指定 _O_CREAT 和 _O_EXCL 标志,但 filename 已经存在。
EINVAL 无效的 oflag 或 shflag 参数。
EMFILE 没有更多可用的文件描述符。
ENOENT 未找到文件或路径。
备注: 宽字符版 int _wsopen( const wchar_t *filename, int oflag, int shflag [, int pmode ] );
代码

#include <sstream>
#include <fstream>
#include <fcntl.h>
#include <share.h>

string strPath = AnsiString(strResaveName.c_str()).c_str();
while(1)
{
     //BCB XE2 不识别_SH_DENYNO只能用0x40表示
    fd = _sopen( strPath.c_str(), _O_RDWR/*打开文件以供读取和写入*/, 0x40/*允许读取和写入访问*/, _S_IREAD | _S_IWRITE/*允许读取和写入*/ );      
    if(-1 == fd)      
    {
        if(IDOK == MessageBox(NULL,"测试结果.xls已被打开,请先关闭文件","提示", MB_OKCANCEL))
        {
            continue;
        }
        else
        {
            return;
        }
    }
    else
    {
        _close(fd); //需要关闭,否则文件被打开产生临时文件
        break;
    }
}

如果Excel文件被打开,fd的值为-1;否则则返回3(测试实际运行结果);

方法二:文件流读写

代码:

ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;

#include <iostream>
#include <fstream>

using namespace std;

#define F_PATH "d:\\example.xlsx"
int main(void)
{
    ofstream iofile(F_PATH,ios::in|ios::out|ios::binary);//打开文件, 默认调用了open()函数
    if(!iofile)//如果打开失败
    {
        cerr<<"open error!"<<endl;//显示出错信息
        abort();//程序退出
    }

    return 0;
}

如果Excel文件被打开,提示“open error”(测试实际运行结果);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章