覆盖文件只能工作一次

时间:2015-11-26 16:28:17

标签: c# winforms filestream streamwriter overwrite

我有一个简单的程序,可以将文件和目录从一个地方复制到另一个地方。我已经设置了如果有任何异常(例如,如果拒绝访问路径),它将创建一个带有错误的日志文件。

我有一个按钮,按下后,执行复制操作。第一次按下按钮时,一切正常,并且使用相应的错误消息创建或覆盖日志文件。

但是,如果我再次按下该按钮,则不会覆盖文本文件,而是附加错误消息。如果我关闭我的程序并再次运行它,则按下第一个按钮就会覆盖该文件。任何想法将不胜感激。

target是一个字符串文件路径,我从FolderBrowserDialog获取并获取所选路径并将其设置为文本框。 loglist只是一个简单的List<string>我用来存储复制过程中出现的任何异常的错误消息。

public partial class Form1 : Form
{

    static List<string> logList = new List<string>();

    public Form1()
    {
        InitializeComponent();
    }


    private static void CopyAll(DirectoryInfo source, DirectoryInfo target)
    {


        if (source.FullName.ToLower() == target.FullName.ToLower())
            return;

        if (Directory.Exists(target.FullName) == false)
        {
            Directory.CreateDirectory(target.FullName);
        }





        foreach (FileInfo fi in source.GetFiles())
        {
            try
            {
                fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
            }
            catch (Exception ex)
            {
                logList.Add(ex.Message);


            }


        }

        foreach (DirectoryInfo diSourceSub in source.GetDirectories())
        {
            DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSub.Name);
            CopyAll(diSourceSub, nextTargetSubDir);

        }



    }


    private void directoryPickerBtn1_Click(object sender, EventArgs e)
    {
        FolderBrowserDialog folderDialog = new FolderBrowserDialog();

        DialogResult folderResult = folderDialog.ShowDialog();
        if (folderResult == DialogResult.OK)
        {

            directoryTextbox1.Text = folderDialog.SelectedPath;
        }


    }

    private void directoryPickerBtn2_Click(object sender, EventArgs e)
    {
        FolderBrowserDialog folderDialog = new FolderBrowserDialog();

        DialogResult folderResult = folderDialog.ShowDialog();
        if (folderResult == DialogResult.OK)
        {
            directoryTextbox2.Text = folderDialog.SelectedPath;
        }
    }

    private void copyBtn_Click(object sender, EventArgs e)
    {
        string source = (directoryTextbox1.Text);
        string target = (directoryTextbox2.Text);



        DirectoryInfo dirSource = new DirectoryInfo(source);
        DirectoryInfo dirTarget = new DirectoryInfo(target);

        try
        {
            CopyAll(dirSource, dirTarget);

            if (logList.Count > 0)
            {
                using (StreamWriter sw = new StreamWriter(target + @"\log.txt", false))
                {
                    foreach (string error in logList)
                    {
                        sw.WriteLine(error);

                    }


                }
            }


            DialogResult result = MessageBox.Show("Copy Succeeded", "Success");
            if (result == DialogResult.OK)
            {
                string myPath = dirTarget.ToString();
                System.Diagnostics.Process prc = new System.Diagnostics.Process();
                prc.StartInfo.FileName = myPath;
                prc.Start();
            }
        }
        catch (Exception)
        {
            MessageBox.Show("Copy Failed", "Failed");
        }


    }
}

}

2 个答案:

答案 0 :(得分:2)

从您的代码中看来,您似乎永远不会清除logList,这意味着该文件正在附加,因为logList仍然包含所有旧条目。

如果您只想在复制之前或完成文件写入之后只需要相关条目,则需要清除副本之间的列表。

这可以作为单独的方法

更好
    try
    {
        CopyAll(dirSource, dirTarget);

        SaveLog(target + @"\log.txt");

        ClearLog();
        //...
    }

    private void SaveLog(string filename)
    {
        if (logList.Count > 0)
        {
            FileStream fs = File.Open(target + @"\log.txt", FileMode.Create);
            using (StreamWriter sw = new StreamWriter(fs))
            {
                foreach (string error in logList)
                {
                    sw.WriteLine(error);
                }
            }
        }
    }

答案 1 :(得分:2)

作为@Reza Aghaei pointed out in comments,问题是你没有清除logList

每次都会重新创建文件,但每次单击“复制”按钮时,日志列表仍会包含上一次复制操作的结果。

因此,您需要在开始新副本时清除列表:

private static void CopyAll(DirectoryInfo source, DirectoryInfo target)
{
    logList.Clear();

    // ...