我正在通过简单的方法将xml
个文件从本地计算机复制到远程共享
DataTable dt = new DataTable();
// composing dt
string file = "test.xml";
string path = Path.Combine(@"C:\local\path", file);
string path2 = Path.Combine(@"\\path\to\remote\share", file);
if (File.Exists(path2)) File.Delete(path2);
dt.WriteXml(path);
File.Copy(path, path2);
我注意到有时复制意外结束于文件中间。 因此,我必须比较源文件和目标文件,以确保它已被完全复制。
如何在不进行比较的情况下强制成功复制?
答案 0 :(得分:2)
文件复制的一般原因是超时,拒绝访问或网络中断。 尝试在复制操作1周围进行尝试捕获,以识别两次停止之间的原因。 如果您可以对另一个本地文件夹执行相同的操作,然后成功启动复制到网络,则唯一的原因可能是网络不稳定。 尝试使用一个很小的文件(一些KB)来查看操作是否成功。这将尝试解决由于文件大小而引起的超时问题。
对于非常大的文件,您必须设置发送者和接收者应用程序。您可以按照此MSDN帖子https://blogs.msdn.microsoft.com/webapps/2012/09/06/wcf-chunking/
中所述使用WCF块化或流式传输答案 1 :(得分:1)
我建议比较源文件和目标文件的校验和,以了解复制是否成功。如果不成功,则可以根据要求采用不同的策略重试或快速失败。
class Program
{
private string fileName = "myFile.xml";
private string sourcePath = @"d:\source\" + fileName;
private string destinationPath = @"d:\destination\" + fileName;
static void Main(string[] args)
{
(new Program()).Run();
}
void Run()
{
PrepareSourceFile();
CopyFile();
}
private void PrepareSourceFile()
{
DataTable helloWorldData = new DataTable("HelloWorld");
helloWorldData.Columns.Add(new DataColumn("Greetings"));
DataRow dr = helloWorldData.NewRow();
dr["Greetings"] = "Ola!";
helloWorldData.Rows.Add(dr);
helloWorldData.WriteXml(sourcePath);
}
private void CopyFile()
{
int numberOfRetries = 3; // I want to retry at least these many times before giving up.
do
{
try
{
File.Copy(sourcePath, destinationPath, true);
}
finally
{
if (CompareChecksum())
numberOfRetries = 0;
}
} while (numberOfRetries > 0);
}
private bool CompareChecksum()
{
bool doesChecksumMatch = false;
if (GetChecksum(sourcePath) == GetChecksum(destinationPath))
doesChecksumMatch = true;
return doesChecksumMatch;
}
private string GetChecksum(string file)
{
using (FileStream stream = File.OpenRead(file))
{
SHA256Managed sha = new SHA256Managed();
byte[] checksum = sha.ComputeHash(stream);
return BitConverter.ToString(checksum).Replace("-", String.Empty);
}
}
}