Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
        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);
        }