private void ProcessFile(SyncFile file) { string fn = _conn.Path + file.F; //_log.Info("create dir : " + LongDirectory.GetDirectoryName(fn)); LongDirectory.CreateDirectory(LongDirectory.GetDirectoryName(fn)); if (LongFile.Exists(fn)) { // kludge : for seconds resolution var fi = new LongFileInfo(fn); var d1 = fi.LastWriteTime.Ticks / _tickfilter; var d2 = file.D.Ticks / _tickfilter; if (d1 >= d2) // skip if already copied or newer { return; } } _connInfo.LastFileNameDownloaded = fn; fn += ".!torpedosync"; // FEATURE : resume semi downloaded file // remove old semi downloaded file LongFile.Delete(fn); if (TorpedoSync.Global.isWindows == false) { fn = fn.Replace("\\", "/"); } _downloading = true; if (downloadfile(file, fn, ClientCommands.Download)) { MoveExistingFileToArchive(file.F); // rename downloaded file LongFile.Move(fn, _conn.Path + file.F); LongFile.SetLastWriteTime(_conn.Path + file.F, file.D); } _downloading = false; }
private static void sendfile(SyncFile file, long start, int size, string path, DFile ret) { if (LongFile.Exists(path + file.F) == false) { ret.err = DownloadError.NOTFOUND; return; } var fi = new LongFileInfo(path + file.F); // kludge : for seconds resolution var d1 = fi.LastWriteTime.Ticks / Global.tickfilter; var d2 = file.D.Ticks / Global.tickfilter; if (d1 == d2) { FileStream fs = null; try { fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); byte[] b = new byte[size]; fs.Seek(start, SeekOrigin.Begin); fs.Read(b, 0, size); ret.err = DownloadError.OK; ret.data = b; } catch { ret.err = DownloadError.LOCKED; } finally { if (fs != null) { fs.Close(); } } } else { ret.err = DownloadError.OLDER; } }
private bool downloadfile(SyncFile file, string saveto, Func <Connection, SyncFile, long, int, DFile> func) { long left = file.S; int retry = 0; int mb = Global.DownloadBlockSizeMB * Global.MB; //Stopwatch sw = new Stopwatch(); //sw.Start(); while (left > 0) { long len = left; long start = file.S - left; if (len > mb) { len = mb; } //sw.Reset(); DFile df = func(_conn, file, start, (int)len); //_connInfo.Mbs = (len / sw.ElapsedTicks) / (1000*TimeSpan.TicksPerSecond) ; if (df == null) { retry++; Thread.Sleep(new Random((int)FastDateTime.Now.Ticks).Next(2000) + 500); if (retry > 10) { _log.Info(" null "); _que.Enqueue(file); //if (LongFile.Exists(saveto)) LongFile.Delete(saveto); return(false); } } else if (df.err == DownloadError.OK) { retry = 0; string ifn = saveto; if (TorpedoSync.Global.isWindows == false) { ifn = saveto.Replace("\\", "/"); } _log.Info("len = " + len + " , " + saveto.Replace(".!torpedosync", "")); left -= len; LongDirectory.CreateDirectory(LongDirectory.GetDirectoryName(ifn)); // save to disk var fs = new FileStream(ifn, FileMode.OpenOrCreate); fs.Seek(0L, SeekOrigin.End); fs.Write(df.data, 0, df.data.Length); fs.Close(); if (left == 0) { var fi = new LongFileInfo(saveto); if (fi.Length != file.S) { // FEATURE : file length don't match _log.Info("file length don't match."); return(false); } } } else if (df.err == DownloadError.OLDER || df.err == DownloadError.LOCKED) { _ErrorQue.Enqueue(file); _connInfo.LastFileNameDownloaded = ""; _log.Info("Locked/Older : " + saveto); return(false); } else if (df.err == DownloadError.NOTFOUND) { _log.Info("Not Found : " + saveto); _connInfo.LastFileNameDownloaded = ""; _ErrorQue.Enqueue(file); LongFile.Delete(saveto); return(false); } } return(true); }