void UploadFile(TreeNode node, TreeNode Rnode) { if (Path.GetExtension(node.Name) == "tmp") { return; } string newFileName = Rnode.Name + node.Text; //ReloadRemoteNode(Rnode); if (FindNode(Rnode, newFileName)) {//先确认是否替换or跳过 int opcode = allowRep; if (opcode == 0) { FileReplace fileReplace = new FileReplace(node.Text); fileReplace.ShowDialog(); if (fileReplace.Flag) { allowRep = fileReplace.Status; } opcode = fileReplace.Status; } if (opcode == -1) { return; } myFTP.RemoveFile(newFileName); } string tempFileName = Path.Combine(node.Parent.Name, System.IO.Path.GetFileNameWithoutExtension(node.Name) + ".tmp"); string remoteTempFileName = Rnode.Name + Path.GetFileNameWithoutExtension(node.Text) + ".tmp"; FileStream tmpStream = null; byte[] bufs = new byte[8192]; if (FindNode(Rnode, remoteTempFileName)) { try { tmpStream = new FileStream(tempFileName, FileMode.Open); tmpStream.Read(bufs, 0, 18); string oldDate = myFTP.ecd.GetString(bufs, 0, 18); tmpStream.Close(); string newDate = myFTP.GetDate(remoteTempFileName); if (oldDate != newDate) { throw new Exception(); } } catch { AddLog("缓存不可用,尝试重新上传:"); if (tmpStream != null) { tmpStream.Close(); } File.Delete(tempFileName); } } //准备缓存文件,并开始下载 FileStream newStream = null; try { //重新生成缓存文件 if (!File.Exists(tempFileName)) { tmpStream = new FileStream(tempFileName, FileMode.Create); string newDate = File.GetLastWriteTime(node.Name).ToString(); byte[] tmps = myFTP.ecd.GetBytes(newDate); //AddLog(tmps.Length.ToString()); tmpStream.Write(myFTP.ecd.GetBytes(newDate), 0, tmps.Length); newStream = new FileStream(node.Name, FileMode.Open); while (true) { int bytes = newStream.Read(bufs, 0, bufs.Length); if (bytes <= 0) { tmpStream.Close(); newStream.Close(); break; } tmpStream.Write(bufs, 0, bytes); } tmpStream.Close(); } myFTP.UploadFile(tempFileName, remoteTempFileName); } catch (Exception ex) { newStream.Close(); tmpStream.Close(); AddLog(ex.Message); } //远程重命名,并删除缓存 myFTP.RenameDir(remoteTempFileName, newFileName); File.Delete(tempFileName); }
void DownloadFile(TreeNode node, TreeNode Lnode) { string newFileName = System.IO.Path.Combine(Lnode.Name, node.Text); if (File.Exists(newFileName)) {//先默认覆盖重传 int opcode = allowRep; if (opcode == 0) { FileReplace fileReplace = new FileReplace(node.Text); fileReplace.ShowDialog(); if (fileReplace.Flag) { allowRep = fileReplace.Status; } opcode = fileReplace.Status; } if (opcode == -1) { return; } File.Delete(newFileName); } string tempFileName = Path.Combine(Lnode.Name, System.IO.Path.GetFileNameWithoutExtension(newFileName) + ".tmp"); FileStream tmpStream = null; if (File.Exists(tempFileName)) { try { tmpStream = new FileStream(tempFileName, FileMode.Open); byte[] bufs = new byte[14]; tmpStream.Read(bufs, 0, 14); string oldDate = myFTP.ecd.GetString(bufs, 0, 14); tmpStream.Close(); string newDate = myFTP.GetDate(node.Name); if (oldDate != newDate) { throw new Exception(); } } catch { AddLog("缓存不可用,尝试重新下载:"); tmpStream.Close(); File.Delete(tempFileName); } } //准备缓存文件,并开始下载 try { //重新生成缓存文件 if (!File.Exists(tempFileName)) { tmpStream = new FileStream(tempFileName, FileMode.Create); string newDate = myFTP.GetDate(node.Name); byte[] tmps = myFTP.ecd.GetBytes(newDate); //AddLog(tmps.Length.ToString()); tmpStream.Write(myFTP.ecd.GetBytes(newDate), 0, tmps.Length); tmpStream.Close(); } myFTP.DownLoadFile(tempFileName, node.Name); } catch (Exception ex) { tmpStream.Close(); AddLog(ex.Message); } //保存,并删除缓存 FileStream file = new FileStream(tempFileName, FileMode.Open); byte[] tmp2 = new byte[8192]; file.Seek(14, SeekOrigin.Begin); FileStream saveFile = new FileStream(newFileName, FileMode.Create); while (true) { int BytesDone = file.Read(tmp2, 0, tmp2.Length); if (BytesDone <= 0) { file.Close(); saveFile.Close(); break; } saveFile.Write(tmp2, 0, BytesDone); } File.Delete(tempFileName); }