吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1485|回复: 6
收起左侧

[求助] win32 如何判断文件已被excel打开

[复制链接]
c03xp 发表于 2021-1-25 14:58
求大神解答:
给一个csv文件建立内存映射文件,映射后如果不用excel打开该文件,可以正常读取,如果用excel打开,读取到的内容全是0,
但是运行过程中没发生任何win32调用错误,也没有返回NULL,我该如何
检测该文件已被excel打开,然后提示先将其关闭?
[C] 纯文本查看 复制代码
LPVOID LoadFileR(LPTSTR lpFilename, DWORD  dwSize)
{
	HANDLE hFile;
	HANDLE hMapping;
	LPVOID ImageBase;
	hFile= CreateFile(lpFilename,GENERIC_WRITE|GENERIC_READ ,0,NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,0);
	if (NULL == hFile){
		return NULL;
	}


	hMapping= CreateFileMapping(hFile,NULL,PAGE_READWRITE ,0,dwSize,NULL);

	if (NULL == hMapping)
	{
		int i = GetLastError();
		CloseHandle(hFile);
		return NULL;
	}
	ImageBase= MapViewOfFile(hMapping,FILE_MAP_WRITE,0,0,0);
	CloseHandle(hFile);
	CloseHandle(hMapping);

	return ImageBase;

}

char* easycsv_csv_loadfile(char* path,unsigned long* psize){
	FILE *fp;
	unsigned long flen;

	if((fp = fopen (path,"r"))==NULL){
		return NULL;
	}
	
	fseek(fp,0L,SEEK_END);
	flen=ftell(fp);
	fclose(fp);
	*psize = flen;
	return (char*)LoadFileR(path,flen);
}	

int main(){
	int i;
	unsigned long flen = 0;

	char* csv = easycsv_csv_loadfile("tst.csv",&flen); 

	printf("csv=%u\n",(unsigned long)csv); 
	char* p = csv;
	for(i=0;i<flen;++i){
		printf("p=%c\n",*p++);
	}

	return 1;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

coolcalf 发表于 2021-1-25 15:12
原理
Excel在打开的时候,会产生前缀是~$的临时文件。只要判断该临时文件是否存在即可。

import os

def check_excel_is_open():
    file_path = 'C:\\Users\\xxxxx\\Desktop'
    file_name = 'eeeee.xlsx'
    temp_file = file_path + '\\' + '~$' + file_name
    if os.path.exists(temp_file):
        print('excel已被打开')
 楼主| c03xp 发表于 2021-1-25 15:19
coolcalf 发表于 2021-1-25 15:12
原理
Excel在打开的时候,会产生前缀是~$的临时文件。只要判断该临时文件是否存在即可。

试了一下,excel文件会产生临时文件,打开csv文件没有临时文件
 楼主| c03xp 发表于 2021-1-25 15:24
发现一个冷门的c函数,百度都找不到几篇文章:
函数原型:int _access(const char *pathname, int mode);

参数:pathname 为文件路径或目录路径 mode 为访问权限(在不同系统中可能用不能的宏定义重新定义)

返回值:如果文件具有指定的访问权限,则函数返回0;如果文件不存在或者不能访问指定的权限,则返回-1.

备注:当pathname为文件时,_access函数判断文件是否存在,并判断文件是否可以用mode值指定的模式进行访问。当pathname为目录时,_access只判断指定目录是否存在,在Windows NT和Windows 2000中,所有的目录都只有读写权限。

mode的值和含义如下所示:

00——只检查文件是否存在

02——写权限

04——读权限

06——读写权限


不过用不上了,我发现现在就算excel打开了文件,我的程序也能读取到内容,一会儿一个样,不知道怎么回事了,放弃算了
 楼主| c03xp 发表于 2021-1-25 16:04
解决了。用createfile函数判断是否可读,不知道是不是标准方法。
int  IsFileLocked(LPCTSTR szFileName)
{
if(szFileName==NULL) return 0;
HANDLE ret;  
ret=CreateFile(szFileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(ret==INVALID_HANDLE_VALUE)  
{
  return 1;
}
CloseHandle(ret);
return 0;
}
海绵宝宝_ 发表于 2021-1-25 16:31
提供一个思路,检测文件被占用的进程,然后拿到程序名称,然后判断
 楼主| c03xp 发表于 2021-1-25 16:51
海绵宝宝_ 发表于 2021-1-25 16:31
提供一个思路,检测文件被占用的进程,然后拿到程序名称,然后判断

知道是否占用就行了,判断被谁占用,估计很麻烦
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 07:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表