【问题标题】:./ changes target when i use OpenFileDialog./ 使用 OpenFileDialog 时更改目标
【发布时间】:2010-09-27 00:54:48
【问题描述】:

我正在使用 streamwriter 记录错误

它的设计方式(请不要问为什么)是每次应用程序必须记录消息时打开一个新的流写入器。它将所有内容输出到 ./Logs/[current-date].txt,通常解析为 "c:\myappfolder\logs[current-date].txt"

一切正常,但是在我使用打开的文件对话框说“C:\home\myfolder\myfile”之后,streamwriter 尝试写入“c:\home\myfolder\logs[current-date].txt "

我知道这个问题的解决方案,但我就是不明白发生了什么

【问题讨论】:

  • 它每次都会打开一个新的流写入器,否则文件将在您的应用程序运行的整个过程中被锁定。

标签: .net c++ relative-path openfiledialog


【解决方案1】:

Mike B 完全正确。

如果您使用的是本机 API 而不是 .NET,则需要在 OPENFILENAME 结构中设置 OFN_NOCHANGEDIR 选项。文档声明它不适用于 Windows XP,但不确定这是否适用于 .NET 版本。

无论您如何解决此问题,请注意,每次打开文件对话框时,它都会在您的原始文件夹中打开。如果你打开很多文件,治疗可能比疾病更糟糕。您最好在程序启动时获取当前目录,并将其添加到您的文件名中。

【讨论】:

  • 设置 InitialDirectory 对此有帮助吗?我不记得了。当前目录的整个概念在我猜的命令行程序领域之外有点过时了。
  • 设置 InitialDirectory 将指定对话框出现时将打开哪个目录,但我不确定当您使用恢复目录选项时是否可以获得正确的值来插入它。
【解决方案2】:

当前目录是一个进程范围的值。

OpenFileDialog 正在更改当前目录。

如果您使用 .NET OpenFileDialog 类,您可以将 RestoreDirectory 属性设置为 true 以告诉对话框不理会当前目录(尽管 RestoreDirectory 的文档是这样编写的可能存在一些线程问题,我想这可能会使这仍然不适合日志记录工具)。

【讨论】:

  • 关于线程问题的要点。我假设出于日志记录的目的,此目录对于每次运行都是固定的。把它保存到一个变量 up from 可能就是诀窍了。
【解决方案3】:

正如 Mike B 所说,OpenFileDialog 可能会更改当前目录。由于./ 是相对于当前的,所以它也会发生变化。

RestoreDirectory 属性修改此行为。

不如做这样的事情:

OpenFileDialog openFileDialog1 = new OpenFileDialog();

OpenFileDialog1.InitialDirectory = "c:\\" ;
openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ;
openFileDialog1.FilterIndex = 2 ;
openFileDialog1.RestoreDirectory = true ;

取自MSDN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2017-05-02
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多