【问题标题】:Save a file in folder opened by dialog box将文件保存在对话框打开的文件夹中
【发布时间】:2014-06-05 14:18:08
【问题描述】:

我的程序有一个树视图,它列出了来自远程计算机的文件。我需要做的是将这些文件从远程复制到我的本地文件夹之一。我希望当我右键单击树视图中的文件时,会出现一个对话框让我选择一个文件夹,然后在对话框中单击“确定”,我单击的文件可以保存在该文件夹中。

由于remote中文件的路径是unc路径,所以我用的是

File.Copy(string remote_address, string local_address)

复制文件。正如我之前所说,我需要一个对话框窗口来选择文件夹。所以我尝试使用FolderBowserDialog,但是它的SelectedPath 属性只返回文件夹的路径,不包括文件夹的名称!而且我还没有找到任何属性来返回文件夹的名称。

所以我的问题是:

  1. 如果有办法让我使用FolderBowserDialog,我可以获得保存文件位置的完整路径吗?
  2. 如果有其他方法允许我从远程复制或下载文件,例如使用SaveFileDialog。问题是我不知道该怎么做。

【问题讨论】:

    标签: c# dialog


    【解决方案1】:

    以下应该有效:

    var fbd = new FolderBrowserDialog();
    if(fbd.ShowDialog() == DialogResult.OK)
    {
        var localPath= Path.Combine(fbd.SelectedPath, Path.GetFilename(remote_address));
        File.Copy(remote_address, localPath);
    }
    

    【讨论】:

    • 哈哈就是这样!非常感谢您的解决方案!
    【解决方案2】:

    我不确定您指的是哪个“SavePath”属性,因为 FolderBrowserDialog 没有这样的属性。您要查找的属性名为SelectedPath

    FolderBrowserDialog dlg = new FolderBrowserDialog();
    dlg.ShowDialog();
    
    string local_address = dlg.SelectedPath;
    

    【讨论】:

    • 那么你的问题是什么?我在对话框中选择了“桌面”,dlg.SelectedPath 返回了“C:\Users\Dan\Desktop”,其中Desktop 是我选择的目录的名称。我没有看到您描述的丢失目录问题。
    • 当我点击桌面上一个名为“local”的文件夹时,返回的地址是“C:\Users\Dan\Desktop”,我想要的是“C:\Users\Dan\Desktop\local ”。如果你只使用 selectedPath 就可以得到我想要的路径,我应该说这很奇怪。
    • @jcraffael 这正是它对我的工作方式。 SelectedPath 包括“本地”。您确定您在对话框中单击了正确的文件夹而不是其父文件夹吗?你没有在你的代码中做任何Path.GetDirectory(),对吧??
    • 好吧,因为我的“本地”文件夹位于桌面上并且它没有子文件夹。在文件夹浏览对话框窗口中,我只能单击“本地”而无法打开它。我没有使用 Path.GetDirectory() 所以我在路径中没有名称“local”。现在感谢其他人的建议,我在代码中使用它并解决了问题。
    • 等等..什么!?使用 Path.GetDirectory() 应该返回路径 without 'local'.. 我觉得有些事情你没有告诉我们,但如果你解决了你的问题,我想这才是最重要的。
    【解决方案3】:

    调用 FolderBrowserDialog 的 ShowDialog() 方法后,它将返回一个变量,指示用户按下了哪个按钮(即,确定或取消)

    在您确定用户使用“Ok”表示他们想要继续操作后,您可以访问“SelectedPath”字段,该字段将为您提供他们选择的完整本地路径。

    然后你可以通过调用得到最终路径

    System.IO.Path.Combine(fbd.SelectedPath,remoteFileName);
    

    我假设 fbd 是您的 FolderBrowserDialog 实例,remoteFileName 应该只包含远程文件的文件名部分(例如“MyFile.txt”);

    如果要将文件名与完整的远程路径分开,请使用

    var remoteFileName = System.IO.Path.GetFileName(remotePath);
    

    话虽如此,用户通常期望的不是文件夹浏览器对话框,而是保存文件对话框。

    您可以使用文件名初始化保存文件对话框,让用户选择一个文件夹,如果他们愿意,还可以更改预期的文件名。

    SaveFileDialog sfd = new SaveFileDialog();
    sfd.FileName = remoteFileName;
    sfd.ShowDialog();
    sfd.FileName // now contains the full path to the file that the user has selected
    

    不要忘记从 ShowDialog() 调用中获取结果,以确保用户没有取消保存对话!

    【讨论】:

    • 感谢您的回复。 Path.getfilename() 正是我需要的方法。对于您使用 sfd 的解决方案,它似乎不起作用,因为没有复制文件的操作,不是吗?
    • SaveFileDialog 实际上并没有进行任何保存,它只是一个对话框。当您单击“保存”或“另存为”时,它会显示您在大多数 Windows 应用程序中获得的经典对话框。即,它不仅可以让您选择文件夹,还可以选择文件名。用户选择新文件位置和名称后,您应该自己调用复制功能。 File.Copy(remote_address, sfd.FileName);
    • 好吧,我想是的。但还有一个问题:File.Copy() 的第二个参数应该是本地地址,即文件夹路径+文件名。使用 folderbrowsedialog.SelectedPath 我至少可以知道文件夹的路径。但是使用 sfd 我怎么知道我选择的文件夹的路径?
    • 对话框关闭后 sfd.FileName 实际上包含完整路径(路径 + 文件名,即“c:\test\myFile.txt”)如果您使用“myFile. txt”,然后当您调用 ShowDialog 时,它将位于默认文件夹中,并在文件名字段中预加载“myFile.txt”。您还可以在打开对话框之前将 FileName 设置为完整路径。例如 sfd.FileName = "c:\Program Files\MyApp\Saves\save.txt" 它将在该位置打开以 save.txt 作为文件名的对话框,允许用户按原样接受或修改位置和/或文件名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多