将文件从源替换为目标

时间:2017-02-06 22:54:35

标签: c# file replace

我需要将源文件夹中的多个文件替换为目标文件夹,这就是我编写的代码。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    namespace bestem_re
    {
        public partial class Form1 : Form
        {
            string[] fnames;
            string[] dfnames;
            string destination;
            public Form1()
            {
                InitializeComponent();
            }

// In this I am fetching the source of the destination files.            

//using the for each loop to iterate to all the selected files
private void btnsource_Click(object sender, EventArgs e)
            {
                OpenFileDialog opf = new OpenFileDialog();



                opf.Multiselect = true;
                if (opf.ShowDialog() == DialogResult.OK)
                {
                    fnames = opf.FileNames;
                    foreach (var item in fnames)
                    {

                        txtsource.Text = txtsource.Text + System.IO.Path.GetFileName(item) + "  ";
                    }

                }


            }
// I Am fetching the destination of the files that are to be replaced.      
            private void btndestination_Click(object sender, EventArgs e)
            {
                OpenFileDialog opf1 = new OpenFileDialog();



                opf1.Multiselect = true;
                if (opf1.ShowDialog() == DialogResult.OK)
                {
                    dfnames = opf1.FileNames;
                    foreach (var item in dfnames)
                    {

                        txtdestination.Text = txtdestination.Text + System.IO.Path.GetFileName(item) + "  ";
                    }
                }

            }
//this is the replace function where in I carry out the process of replacing the files    
            private void btnreplace_Click(object sender, EventArgs e)
            {

                string source;
                int i = 0;

                destination = System.IO.Path.GetDirectoryName(dfnames[0]);
                MessageBox.Show(destination);


                foreach (var item in fnames)
                {
                    source = item;
                    string fname = System.IO.Path.GetFileName(fnames[i]);
                    string dfname = System.IO.Path.GetFileName(dfnames[i]);
                    string FileToBackUp = destination + @"\" + dfname + ".bac";
                    MessageBox.Show("Bestem BOX");
                    System.IO.File.Replace(source, destination, FileToBackUp);
                    System.IO.File.Copy(destination, source);
                    MessageBox.Show("Successfull");
                    destination = "";
                    i++;
                }

            }

        }
    }

//replace files from source to destination

2 个答案:

答案 0 :(得分:0)

您的问题是destination

destination = System.IO.Path.GetDirectoryName(dfnames[0]); // is a directory
// usage:
System.IO.File.Replace(source, destination, FileToBackUp);

将抛出UnauthorizedAccessException,因为

  

UnauthorizedAccessException

     

[... if]源或目标参数指定目录而不是a   文件。

答案 1 :(得分:0)

你的问题很模糊。在上面的代码中,我必须使用OpenFileDialog来获取文件,然后再次设置目标。这不仅看起来很奇怪,而且对于保存到错误位置和文件名的文件是开放的。

当您允许用户使用打开的文件对话框选择x个文件时,请求用户选择目标文件进行备份,使用不同的打开文件对话框有一些严重问题?如果出现这种情况,则用户必须以相同的顺序选择相同的SAME精确文件才能使其正常工作。让用户选择目的地似乎很奇怪且容易出错。

只需使用用户在第一个打开文件对话框中选择的文件,然后将这些文件备份到设置的目标文件夹,在这种情况下,在文件名末尾添加“.bac”扩展名的相同文件夹。下面的代码使用打开的文件对话框来执行此操作以获取要备份的文件。 btnsource_Click调用BackupFiles,因此只需按一个按钮即可备份所选文件。我希望这是有道理的。

private void btnsource_Click(object sender, EventArgs e) {
  OpenFileDialog opf = new OpenFileDialog();
  opf.Multiselect = true;
  if (opf.ShowDialog() == DialogResult.OK) {
    string[] fnames = opf.FileNames;
    foreach (var item in fnames) {
      textBox1.Text = textBox1.Text + System.IO.Path.GetFileName(item) + Environment.NewLine;
    }
    BackupFiles(fnames);
  }
}

private void BackupFiles(string[] fnames) {
  string source;
  int i = 0;
  string destination = System.IO.Path.GetDirectoryName(fnames[0]);
  string fname = "";
  string FileToBackUp = "";

  foreach (var item in fnames) {
    source = item;
    fname = System.IO.Path.GetFileName(fnames[i]);
    FileToBackUp = destination + @"\" + fname + ".bac";
    File.Copy(source, FileToBackUp, true);
    i++;
  }
  MessageBox.Show("Successfull");
}