コード例 #1
0
        private static void sendzip(string file, long start, int size, string path, DFile ret)
        {
            if (LongFile.Exists(path + file) == false)
            {
                ret.err = DownloadError.NOTFOUND;
                return;
            }

            FileStream fs = null;

            try
            {
                fs = new FileStream(path + file, 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();
                }
            }
        }
コード例 #2
0
        public static void DeleteZip(string sharename, string token, SyncFile file)
        {
            var   share = Global.Shares.Find(x => x.Name == sharename);
            DFile ret   = new DFile();

            ret.err = DownloadError.NOTFOUND;
            string path = share.Path + ".ts" + _S + "Temp" + _S;

            if (File.Exists(path + file.F))
            {
                File.Delete(path + file.F);
            }
        }
コード例 #3
0
        public static DFile Download(string sharename, string token, SyncFile file, long start, int size)
        {
            var   share = Global.Shares.Find(x => x.Name == sharename);
            DFile ret   = new DFile();

            ret.err = DownloadError.NOTFOUND;
            if (share == null)
            {
                var cs = Global.ConnectionList.Find(x => x.Name == sharename);
                if (cs != null && cs.Token == token)
                {
                    sendfile(file, start, size, cs.Path, ret);
                }
            }
            else if (share.ReadOnlyToken == token || share.ReadWriteToken == token)
            {
                sendfile(file, start, size, share.Path, ret);
            }
            return(ret);
        }
コード例 #4
0
        public static DFile DownloadZip(string sharename, string token, SyncFile file, long start, int size)
        {
            var   share = Global.Shares.Find(x => x.Name == sharename);
            DFile ret   = new DFile();

            ret.err = DownloadError.NOTFOUND;

            if (share == null)
            {
                var cs = Global.ConnectionList.Find(x => x.Name == sharename && x.Token == token);
                if (cs != null)
                {
                    string path = cs.Path + ".ts" + _S + "Temp" + _S;
                    sendzip(file.F, start, size, path, ret);
                }
            }
            else if (share.ReadOnlyToken == token || share.ReadWriteToken == token)
            {
                string path = share.Path + ".ts" + _S + "Temp" + _S;
                sendzip(file.F, start, size, path, ret);
            }
            return(ret);
        }
コード例 #5
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;
            }
        }
コード例 #6
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);
        }