Как получить путь к файлу из OpenFileDialog и FolderBrowserDialog?

Эй, я начал изучать C# несколько дней назад, и я пытаюсь сделать программу, которая копирует и вставляет файлы (и заменяет, если это необходимо) в выбранный каталог, но я не знаю, как получить каталог и пути к файлам из openfiledialog и folderbrowserdialog

что я делаю не так?

вот код:

namespace filereplacer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void direc_Click(object sender, EventArgs e)
        {
            string folderPath = "";
            FolderBrowserDialog directchoosedlg = new FolderBrowserDialog();
            if (directchoosedlg.ShowDialog() == DialogResult.OK)
            {
                folderPath = directchoosedlg.SelectedPath;
            }
        }

        private void choof_Click(object sender, EventArgs e)
        {

            OpenFileDialog choofdlog = new OpenFileDialog();
            choofdlog.Filter = "All Files (*.*)|*.*";
            choofdlog.FilterIndex = 1;

            choofdlog.Multiselect = true;
            choofdlog.ShowDialog();
        }

        private void replacebtn_Click(object sender, EventArgs e)
        {
          // This is where i'm having trouble
        }

        public static void ReplaceFile(string FileToMoveAndDelete, string FileToReplace, string BackupOfFileToReplace)
        {
            File.Replace(FileToMoveAndDelete, FileToReplace, BackupOfFileToReplace, false);
        }
    }

8 ответов


на диалоговое окно openfiledialog:

OpenFileDialog choofdlog = new OpenFileDialog();
choofdlog.Filter = "All Files (*.*)|*.*";
choofdlog.FilterIndex = 1;
choofdlog.Multiselect = true;

if (choofdlog.ShowDialog() == DialogResult.OK)    
{     
    string sFileName = choofdlog.FileName; 
    string[] arrAllFiles = choofdlog.FileNames; //used when Multiselect = true           
}

на FolderBrowserDialog:

FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.Description = "Custom Description"; 

if (fbd.ShowDialog() == DialogResult.OK)
{
    string sSelectedPath = fbd.SelectedPath;
}

получить доступ к selected folder и selected file name вы можете объявить обе строки в класс.

namespace filereplacer
{
   public partial class Form1 : Form
   {
      string sSelectedFile;
      string sSelectedFolder;

      public Form1()
      {
         InitializeComponent();
      }

      private void direc_Click(object sender, EventArgs e)
      {
         FolderBrowserDialog fbd = new FolderBrowserDialog();
         //fbd.Description = "Custom Description"; //not mandatory

         if (fbd.ShowDialog() == DialogResult.OK)      
               sSelectedFolder = fbd.SelectedPath;
         else
               sSelectedFolder = string.Empty;    
      }

      private void choof_Click(object sender, EventArgs e)
      {
         OpenFileDialog choofdlog = new OpenFileDialog();
         choofdlog.Filter = "All Files (*.*)|*.*";
         choofdlog.FilterIndex = 1;
         choofdlog.Multiselect = true;

         if (choofdlog.ShowDialog() == DialogResult.OK)                 
             sSelectedFile = choofdlog.FileName;            
         else
             sSelectedFile = string.Empty;       
      }

      private void replacebtn_Click(object sender, EventArgs e)
      {
          if(sSelectedFolder != string.Empty && sSelectedFile != string.Empty)
          {
               //use selected folder path and file path
          }
      }
      ....
}

Примечание:

как вы сохранили choofdlog.Multiselect=true;, это значит OpenFileDialog() вы можете выбрать несколько файлов (клавиша ctrl ключ и левый щелчок мыши для выбор.)

в этом случае вы можете получить все выбранные файлы в string[]:

На Уровне Класса:

string[] arrAllFiles;

найдите эту строку (при Multiselect=true эта строка дает только первый файл):

sSelectedFile = choofdlog.FileName; 

чтобы получить все файлы, используйте этот:

arrAllFiles = choofdlog.FileNames; //this line gives array of all selected files

вы можете сохранить путь в строковую переменную, например

string s = choofdlog.FileName;

использовать Path класс System.IO. Он содержит полезные вызовы для управления путями файлов, включая GetDirectoryName который делает то, что вы хотите, возвращая часть каталог путь к файлу.

использование просто.

string directoryPath = System.IO.Path.GetDirectoryName(choofdlog.FileName);

чтобы получить полный путь к выбранному файлу или файлам, вам нужно использовать имя файла свойства для одного файла или имена свойства для нескольких файлов.

var file = choofdlog.FileName; // for one file

или для нескольких файлов

var files = choofdlog.FileNames; // for multiple files.

чтобы получить каталог файла, вы можете использовать путь.GetDirectoryName
Вот Джон Кит ответ к аналогичному вопросу о получении каталогов из path


код choofdlog держит FileName и FileNames (для множественного выбора), содержащий пути к файлам, после ShowDialog() возвращает.


создайте этот класс как расширение:

public static class Extensiones
{
    public static string FolderName(this OpenFileDialog ofd)
    {
            string resp = "";
            resp = ofd.FileName.Substring(0, 3);
            var final = ofd.FileName.Substring(3);
            var info = final.Split('\');
            for (int i = 0; i < info.Length - 1; i++)
            {
                resp += info[i] + "\";
            }
            return resp;
    }
}

тогда вы можете использовать следующим образом:

        //ofdSource is an OpenFileDialog 
        if (ofdSource.ShowDialog(this) == DialogResult.OK)
        {
            MessageBox.Show(ofdSource.FolderName());
        }

примитивное быстрое исправление, которое работает.

если вы используете OpenFileDialog, можно записать FileName, SafeFileName, затем вычесть, чтобы получить путь к папке:

exampleFileName = ofd.SafeFileName;
exampleFileNameFull = ofd.FileName;
exampleFileNameFolder = ofd.FileNameFull.Replace(ofd.FileName, "");

извините, если я опоздал ответить здесь, но я просто подумал, что должен бросить гораздо более простое решение для OpenDialog.

OpenDialog ofd = new OpenDialog();
var fullPathIncludingFileName = ofd.Filename; //returns the full path including the filename
var fullPathExcludingFileName = ofd.Filename.Replace(ofd.SafeFileName, "");//will remove the filename from the full path

Я еще не использовал FolderBrowserDialog раньше, поэтому я буду доверять моим коллегам-кодерам. Надеюсь, это поможет.