使用这两个函数后,选择文件过程中,如果当前目录改变了,那程序运行的当前路经也会实时改变,使用GetCurrentDirectory和SetCurrentDirectory只是事前备份事后还原罢了,对于选择文件过程中是没有作用的,同理设置OFN_NOCHANGEDIR也一样效果。
大侠们有没有办法使得当前运行路经不会实时改变?或者有没有其他函数可以替代它?如能解决不胜感激涕零!
因为程序运行的当前相对路径一经改变,所有基于相对路径的内容都会出错,例如保存一个123.dat文件到 相对路径/save/文件夹上,原本程序的最终路径是E://程序/save/,但如果此时当前相对路径变成了桌面,就变成/桌面/save了,此时桌面就多了save这个文件夹,并且里面保存了123.dat文件.
错误就在于使用GetOpenFileName进行选择文件过程中,同时利用相对路径执行保存123.dat的操作后,将123.dat这个文件保存在错误的路径上,如保存在桌面/save/,原本不想保存在这里的.
确认不是代码问题,我正在使用GetOpenFileName进行选择文件过程中,我另外的线程会自动执行保存123.dat的操作,而保存的路经是以相对路经为依据的,这里由于特殊原因是不能改的,所以才这么郁闷。
终于解决了。。。原来可以通过设置回调函数监视对话框改变文件夹路径更改的信息,一接受这个消息立即将相对路径恢复正确的路径。愿意将全部分数给听得懂我说的朋友,交个朋友。
关于GetOpenFileName和GetSaveFileName的问题
答案:6 悬赏:60 手机版
解决时间 2021-02-15 20:54
- 提问者网友:活着好累
- 2021-02-15 07:53
最佳答案
- 五星知识达人网友:西风乍起
- 2021-02-15 08:44
可以这样,但是不一定绝对可靠。
因为线程的抢占是代码级的,所以很有可能你的回调函数正在执行,或还未执行的时候,另一个线程保存了文件,这样的话还是会出现问题。当然这种可能比较小。
可以使用变量控制另一个线程在选择过程中不保存文件。
GetCurrentDirectory(...);
saveAble = false;
GetOpenFileName(...);
saveAble = true;
SetCurrentDirectory(...)
另一线程:
if(saveAble) SaveFile("save\\123.data");
当然如果你的程序必须在选择过程中保存文件的话你的方法也是可取的。
因为线程的抢占是代码级的,所以很有可能你的回调函数正在执行,或还未执行的时候,另一个线程保存了文件,这样的话还是会出现问题。当然这种可能比较小。
可以使用变量控制另一个线程在选择过程中不保存文件。
GetCurrentDirectory(...);
saveAble = false;
GetOpenFileName(...);
saveAble = true;
SetCurrentDirectory(...)
另一线程:
if(saveAble) SaveFile("save\\123.data");
当然如果你的程序必须在选择过程中保存文件的话你的方法也是可取的。
全部回答
- 1楼网友:平生事
- 2021-02-15 11:25
你想干嘛?
- 2楼网友:傲气稳了全场
- 2021-02-15 11:19
是有这个问题,openfile savefile 都回更改当前文件夹路径,
备份恢复好像是比较正常的解决方法, 回调函数还得重新写,得不偿失,我不明白你为什么不用绝对路径呢?
- 3楼网友:长青诗
- 2021-02-15 10:56
太麻烦了,在保存文件前,可以先获取执行程序的所在路径,参考代码:
void GetProgramPath(LPTSTR pszBuffer, DWORD dwSize)
{
DWORD dwLength = GetModuleFileName(GetModuleHandle(NULL), pszBuffer, dwSize);
while (dwLength && pszBuffer[dwLength] != '\\') {
dwLength--;
}
if (dwLength)
pszBuffer[dwLength + 1] = '\0';
}
- 4楼网友:我住北渡口
- 2021-02-15 09:58
C语言无法实现该操作。你可以试着用java
- 5楼网友:掌灯师
- 2021-02-15 09:38
仔细检查你的代码...正常正确情况下不会出现楼主现象...
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯