您的位置:首页 > 编程语言 > C语言/C++

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

2016-08-03 20:10 971 查看

方法一:_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”(测试实际运行结果);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++-sopen
相关文章推荐