C # Windows Forms - выбор и копирование нескольких файлов w MultiSelect, OpenFileDialog и FileBrowserDialog - PullRequest
1 голос
/ 16 марта 2011

Я разрабатываю приложение WinForms, используя C # с OpenFileDialog и FileBrowserDialog, и я хотел бы:

  1. Включить выбор нескольких файлов xls.
  2. После того, как выбор сделан, Показать выбранные имена файлов xlsx в текстовом поле
  3. Скопировать выбранные файлы в отдельный каталог Консолидированный

Как мне это сделать?

Ответы [ 3 ]

12 голосов
/ 16 марта 2011

Вот пример кода:

        OpenFileDialog od = new OpenFileDialog();
        od.Filter = "XLS files|*.xls";
        od.Multiselect = true;
        if (od.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            string tempFolder = System.IO.Path.GetTempPath();

            foreach (string fileName in od.FileNames)
            {
                System.IO.File.Copy(fileName, tempFolder + @"\" + System.IO.Path.GetFileName(fileName));
            }
        }
8 голосов
/ 16 марта 2011

Существует MultiSelect свойство OpenFileDialog, которое необходимо установить на true, чтобы разрешить выбор нескольких файлов.

Вот пример кода из MSDN, который позволяет пользователю выбрать несколько изображений и отобразить их в элементах управления PictureBox на форме:

private void Form1_Load(object sender, EventArgs e)
{
  InitializeOpenFileDialog();
}

private void InitializeOpenFileDialog()
{
  // Set the file dialog to filter for graphics files.
  this.openFileDialog1.Filter =
    "Images (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|" +
    "All files (*.*)|*.*";

  // Allow the user to select multiple images.
  this.openFileDialog1.Multiselect = true;
  this.openFileDialog1.Title = "My Image Browser";
}

private void selectFilesButton_Click(object sender, EventArgs e)
{
  DialogResult dr = this.openFileDialog1.ShowDialog();
  if (dr == System.Windows.Forms.DialogResult.OK)
  {
    // Read the files
    foreach (String file in openFileDialog1.FileNames) 
    {
        // Create a PictureBox.
        try
        {
            PictureBox pb = new PictureBox();
            Image loadedImage = Image.FromFile(file);
            pb.Height = loadedImage.Height;
            pb.Width = loadedImage.Width;
            pb.Image = loadedImage;
            flowLayoutPanel1.Controls.Add(pb);
        }
        catch (SecurityException ex)
        {
            // The user lacks appropriate permissions to read files, discover paths, etc.
            MessageBox.Show("Security error. Please contact your administrator for details.\n\n" +
                "Error message: " + ex.Message + "\n\n" +
                "Details (send to Support):\n\n" + ex.StackTrace
            );
        }
        catch (Exception ex)
        {
            // Could not load the image - probably related to Windows file system permissions.
            MessageBox.Show("Cannot display the image: " + file.Substring(file.LastIndexOf('\\'))
                + ". You may not have permission to read the file, or " +
                "it may be corrupt.\n\nReported error: " + ex.Message);
        }
    }
}
1 голос
/ 24 марта 2011

Комбинируя оба ответа, вот код, который я придумал:

  • Разрешение пользователю Выбор нескольких файлов XLSX (с использованием MultiSelect, OpenFileDialog, this.OpenFileDialog Properties &FileBrowserDialog)
  • После того, как выбор сделан, Показать выбранные имена файлов XLSX в текстовом поле (путем задания значения textBoxSourceFiles.Text для sourceFileOpenFileDialog.FileNames)
  • Копироватьвыбранные файлы в отдельный консолидированный каталог (с помощью цикла foreach, System.IO.File.Copy, System.IO.Path.GetFileName, sourceFileOpenFileDialog.FileName)

    private void sourceFiles_Click(object sender, EventArgs e)
    {
        Stream myStream;
        OpenFileDialog sourceFileOpenFileDialog = new OpenFileDialog();
    
        this.sourceFileOpenFileDialog.InitialDirectory = "i:\\CommissisionReconciliation\\Review\\";
        this.sourceFileOpenFileDialog.Filter = "Excel Files (*.xls;*.xlsx;)|*.xls;*.xlsx;|All Files (*.*)|*.*";
        this.sourceFileOpenFileDialog.FilterIndex = 2;
        this.sourceFileOpenFileDialog.RestoreDirectory = true;
        this.sourceFileOpenFileDialog.Multiselect = true;
        this.sourceFileOpenFileDialog.Title = "Please Select Excel Source File(s) for Consolidation";
    
        if (sourceFileOpenFileDialog.ShowDialog() == DialogResult.OK)
        {
            try
            {
                if ((myStream = sourceFileOpenFileDialog.OpenFile()) != null)
                {
                    using (myStream)
                    {
                        // populates text box with selected filenames 
                        textBoxSourceFiles.Text = sourceFileOpenFileDialog.FileNames; 
                    }
                }       // ends if 
            }           // ends try 
    
            catch (Exception ex)
            {
                MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
            }
        }              // ends if (sourceFileOpenFileDialog.ShowDialog() == DialogResult.OK)
    }                  // ends public void sourceFiles_Click
    
    private void consolidateButton_Execute_Click(object sender, EventArgs e)
    {
    
        string consolidatedFolder = targetFolderBrowserDialog.SelectedPath; 
    
            foreach (String file in sourceFileOpenFileDialog.FileNames)
            {
                try
                {
                    // Copy each selected xlsx files into the specified TargetFolder 
    
                    System.IO.File.Copy(sourceFileOpenFileDialog.FileName, consolidatedFolder + @"\" + System.IO.Path.GetFileName(sourceFileOpenFileDialog.FileName));
                    Log("File" + sourceFileOpenFileDialog.FileName + " has been copied to " + consolidatedFolder + @"\" + System.IO.Path.GetFileName(sourceFileOpenFileDialog.FileName));
                }  
            }          // ends foreach loop
    }                  // ends void consolidateButton_Execute_Click
    
...