覆盖文件只能工作一次
Overwrite file only works once
我有一个简单的程序,可以将文件和目录从一个地方复制到另一个地方。我已经设置好,如果有任何异常(例如,如果访问路径被拒绝),它将创建一个包含错误的日志文件。
我有一个按钮,按下时执行复制操作。第一次按下按钮时一切正常,日志文件被创建或被适当的错误消息覆盖。
但是,如果我再次按下按钮,文本文件不会被覆盖,而是会附加错误消息。如果我关闭我的程序并再次 运行 它,该文件将在第一次按下按钮时被覆盖。任何想法将不胜感激。
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");
}
}
}
}
从您的代码看来,您似乎从未清除 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);
}
}
}
}
如@Reza Aghaei ,问题是你没有清除logList
。
每次都会重新创建文件,但每次单击“复制”按钮时,日志列表仍包含上一次复制操作的结果。
所以开始新副本的时候需要清空列表:
private static void CopyAll(DirectoryInfo source, DirectoryInfo target)
{
logList.Clear();
// ...
我有一个简单的程序,可以将文件和目录从一个地方复制到另一个地方。我已经设置好,如果有任何异常(例如,如果访问路径被拒绝),它将创建一个包含错误的日志文件。
我有一个按钮,按下时执行复制操作。第一次按下按钮时一切正常,日志文件被创建或被适当的错误消息覆盖。
但是,如果我再次按下按钮,文本文件不会被覆盖,而是会附加错误消息。如果我关闭我的程序并再次 运行 它,该文件将在第一次按下按钮时被覆盖。任何想法将不胜感激。
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");
}
}
}
}
从您的代码看来,您似乎从未清除 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);
}
}
}
}
如@Reza Aghaei logList
。
每次都会重新创建文件,但每次单击“复制”按钮时,日志列表仍包含上一次复制操作的结果。
所以开始新副本的时候需要清空列表:
private static void CopyAll(DirectoryInfo source, DirectoryInfo target)
{
logList.Clear();
// ...