关于GetOpenFileName和GetSaveFileName的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于GetOpenFileName和GetSaveFileName的问题相关的知识,希望对你有一定的参考价值。

使用这两个函数后,选择文件过程中,如果当前目录改变了,那程序运行的当前路经也会实时改变,使用GetCurrentDirectory和SetCurrentDirectory只是事前备份事后还原罢了,对于选择文件过程中是没有作用的,同理设置OFN_NOCHANGEDIR也一样效果。
大侠们有没有办法使得当前运行路经不会实时改变?或者有没有其他函数可以替代它?如能解决不胜感激涕零!
因为程序运行的当前相对路径一经改变,所有基于相对路径的内容都会出错,例如保存一个123.dat文件到 相对路径/save/文件夹上,原本程序的最终路径是E://程序/save/,但如果此时当前相对路径变成了桌面,就变成/桌面/save了,此时桌面就多了save这个文件夹,并且里面保存了123.dat文件.
错误就在于使用GetOpenFileName进行选择文件过程中,同时利用相对路径执行保存123.dat的操作后,将123.dat这个文件保存在错误的路径上,如保存在桌面/save/,原本不想保存在这里的.
确认不是代码问题,我正在使用GetOpenFileName进行选择文件过程中,我另外的线程会自动执行保存123.dat的操作,而保存的路经是以相对路经为依据的,这里由于特殊原因是不能改的,所以才这么郁闷。

终于解决了。。。原来可以通过设置回调函数监视对话框改变文件夹路径更改的信息,一接受这个消息立即将相对路径恢复正确的路径。愿意将全部分数给听得懂我说的朋友,交个朋友。

可以这样,但是不一定绝对可靠。

因为线程的抢占是代码级的,所以很有可能你的回调函数正在执行,或还未执行的时候,另一个线程保存了文件,这样的话还是会出现问题。当然这种可能比较小。

可以使用变量控制另一个线程在选择过程中不保存文件。

GetCurrentDirectory(...);
saveAble = false;
GetOpenFileName(...);
saveAble = true;
SetCurrentDirectory(...)

另一线程:
if(saveAble) SaveFile("save\\123.data");

当然如果你的程序必须在选择过程中保存文件的话你的方法也是可取的。
参考技术A 太麻烦了,在保存文件前,可以先获取执行程序的所在路径,参考代码:
void GetProgramPath(LPTSTR pszBuffer, DWORD dwSize)

DWORD dwLength = GetModuleFileName(GetModuleHandle(NULL), pszBuffer, dwSize);
while (dwLength && pszBuffer[dwLength] != '\\')
dwLength--;


if (dwLength)
pszBuffer[dwLength + 1] = '\0';
参考技术B 是有这个问题,openfile savefile 都回更改当前文件夹路径,
备份恢复好像是比较正常的解决方法, 回调函数还得重新写,得不偿失,我不明白你为什么不用绝对路径呢?
参考技术C C语言无法实现该操作。你可以试着用java 参考技术D 你想干嘛?

如何在pyside中为QtGui.QFileDialog.getOpenFileName定义一个QDir?

【中文标题】如何在pyside中为QtGui.QFileDialog.getOpenFileName定义一个QDir?【英文标题】:How to define a QDir in pyside for QtGui.QFileDialog.getOpenFileName? 【发布时间】:2014-05-15 18:48:25 【问题描述】:

我想使用

打开一个文件对话框
fileName = QtGui.QFileDialog.getOpenFileName(self, "Open File", QtCore.QDir("/home/user"))

但是这个表达式给出了以下错误:

TypeError: 'PySide.QtGui.QFileDialog.getOpenFileName' called with wrong argument types:
  PySide.QtGui.QFileDialog.getOpenFileName(ImageViewer, str, PySide.QtCore.QDir)
Supported signatures:
  PySide.QtGui.QFileDialog.getOpenFileName(PySide.QtGui.QWidget = None, unicode = QString(), unicode = QString(), unicode = QString(), PySide.QtCore.QString = QString(), PySide.QtGui.QFileDialog.Options = 0)

这里的文档没用,因为文档只存在于 Qt for C++ 的显着位置(也许 pyside 有一些隐藏的文档......?)。而且由于 C++ 和 python 之间的数据类型有点不同,我无法解决我的问题。

有什么建议吗?

【问题讨论】:

看看pyside documentation 绝对路径示例:QDir("/home/user/Documents") QDir("C:/Documents and Settings") 但这对我的问题不起作用! QDir 不在支持的签名列表中。所以我假设你应该把它作为一个字符串传递。 是的,这行得通。但从“标准”Qt 文档中并不明显......,谢谢 @Alex 'standard' PySide 文档在这里 pyside.github.io/docs/pyside - 文档链接可以在 pyside 主页上找到 qt-project.org/wiki/PySide 并且它没有隐藏! 【参考方案1】:

http://pyside.github.io/docs/pyside/ PySide 文档。

查看静态函数部分。 http://pyside.github.io/docs/pyside/PySide/QtGui/QFileDialog.html

parent = None # QtGui.QMainWindow()
filters = "All File (*);;CSV (*.csv *.CSV)" # Only allow these file ext to be opened
title = "Save As"
open_at = "directory/"
results = QtGui.QFileDialog.getOpenFileName(parent, title, open_at, filters)

QtCore.QDir 是一个对象。它需要 unicode / str。所以只需使用“/home/user”。

"/home/user"
or
QtCore.QDir("/home/user").absolutePath() # This ensures that the given location exists.

【讨论】:

请更新文档链接,应该是pyside.github.io/docs/pyside - 谢谢

以上是关于关于GetOpenFileName和GetSaveFileName的问题的主要内容,如果未能解决你的问题,请参考以下文章

QFileDialog::getOpenFileName 在调试时崩溃,显然是由项目名称引起的?

getOpenFileName 上的进度条

如何在pyside中为QtGui.QFileDialog.getOpenFileName定义一个QDir?

Application.GetOpenFilename 使用说明

如何调用 GetOpenFileName? [复制]

从 Access for Excel GetOpenFileName 设置默认文件路径