Example #1
0
        private void m_ThreadCompleteFile()
        {
            CHash m_EdonkeyHash;
            byte[] m_Hash;
            m_EdonkeyHash	= new CHash();

            //lock the file for read/write
            while ((m_isReadingFile) ||(m_isWritingFile))
            {
                //Debug.WriteLine("[File] Intentando entrar a ESCRIBIR BLOQUE: " + start.ToString() + "-" + end.ToString() + ". " + m_FileName);
                Thread.Sleep(500);
            }
            m_isWritingFile=true;

            m_Hash=m_EdonkeyHash.DoFileHash(m_MyFile);

            //unlock the file
            m_isWritingFile	= false;

            if (!(CKernel.SameHash(ref (byte[])m_Hash, ref (byte[])FileHash)))
            {
                FileStatus=Protocol.FileState.Ready;
                if (m_MyFile.Length>0) m_CheckCompleteChunk(0,m_FileSize-1,false,m_EdonkeyHash.HashSet);
                if (m_Gaps.Count==0)
                {
                    m_Gaps.Add((uint)0,m_FileSize-1);
                    //inicializo el hashset... para volverlo a pedir (por si ha llegado corrupto)

                    m_NumChunks=0;
                    m_ChunksStatus=new Byte[m_NumChunks];
                    for (int i=0;i!=m_ChunksStatus.Length;i++)
                    {
                        m_ChunksStatus[i]=(byte)Protocol.ChunkState.Empty;
                    }

                    m_HashSet=new ArrayList(m_NumChunks);

                    CLog.Log(Constants.Log.Notify, "Corrupted file: " + m_FileName + ". Returning to download the complete file.");
                }
                else
                {
                    CLog.Log(Constants.Log.Notify, "Corrupted file: " + m_FileName + ". Returning to download the corrupted chunks.");
                }
            }
            else
            {
                if (m_CloseFileWrite())
                {
                    //mover el fichero
                    m_FileFolder=CKernel.Preferences.GetStringArray("SharedFolders")[0]; //cojo el 1er directorio de los compartidos
                    if (!Directory.Exists(m_FileFolder))
                    {
                        Directory.CreateDirectory(m_FileFolder);
                    }

                    string filenametodisk;

                    filenametodisk = m_FileName;

                    filenametodisk = filenametodisk.Replace("|","");
                    filenametodisk = filenametodisk.Replace("\\","");
                    filenametodisk = filenametodisk.Replace("/","");
                    filenametodisk = filenametodisk.Replace(":","");
                    filenametodisk = filenametodisk.Replace("*","");
                    filenametodisk = filenametodisk.Replace("?","");
                    filenametodisk = filenametodisk.Replace("<","");
                    filenametodisk = filenametodisk.Replace(">","");

                    //
                    Regex r = new Regex(@"^con$|^prn$|(^lpt[0-9]$)|(^com[0-9]$)|(^con\.)|(^prn\.)|(^lpt[0-9]\.)|(^com[0-9]\.)",RegexOptions.IgnoreCase);
                    // Find a match in the file name.
                    Match m = r.Match(filenametodisk);
                    if (m.Success)
                    {
                        filenametodisk = "_" + filenametodisk;
                    }

                    //comprobar que la longitud de la ruta de acceso no es superior a 260 caracteres
                    if ((m_FileFolder.Length + filenametodisk.Length) >= 260)
                    {
                        int long_max = 260 - (m_FileFolder.Length +1);
                        int index = filenametodisk.LastIndexOf(".");
                        if (index > ((uint)filenametodisk.Length-(uint)long_max))
                        {
                            filenametodisk = filenametodisk.Substring(0,(int)(((uint)index-1) - ((uint)filenametodisk.Length-(uint)long_max))) + filenametodisk.Substring(index, (filenametodisk.Length-index));
                        }
                        else
                        {
                            filenametodisk=filenametodisk.Substring(0,long_max-1);
                        }
                    }

                    string newCompleteName=Path.Combine(m_FileFolder, filenametodisk);
                    int i=0;
                    while (File.Exists(newCompleteName))
                    {
                        filenametodisk=string.Concat("["+i+"] " , filenametodisk);
                        //comprobar que la longitud de la ruta de acceso no es superior a 260 caracteres
                        if ((m_FileFolder.Length + filenametodisk.Length) >= 260)
                        {
                            int long_max = 260 - (m_FileFolder.Length +1);
                            int index = filenametodisk.LastIndexOf(".");
                            if (index > ((uint)filenametodisk.Length-(uint)long_max))
                            {
                                filenametodisk = filenametodisk.Substring(0,(int)(((uint)index-1) - ((uint)filenametodisk.Length-(uint)long_max))) + filenametodisk.Substring(index, (filenametodisk.Length-index));
                            }
                            else
                            {
                                filenametodisk=filenametodisk.Substring(0,long_max-1);
                            }
                        }
                        newCompleteName=Path.Combine(m_FileFolder, filenametodisk);
                        i++;
                    }
                    FileName=filenametodisk;

                    try
                    {
                        File.Move(m_CompleteName,newCompleteName);
                        m_Completed=true;
                        m_CompleteName=newCompleteName;
                        m_FileDetails.DiskFileName=m_CompleteName;

                        m_FileDate=File.GetLastWriteTime(m_CompleteName).ToUniversalTime();

                        //llamar a la funcin de grabar el know.met (despues de poner m_Completed=true
                        CKernel.FilesList.SaveList("");

                        CKernel.FilesList.CompleteFile(CKernel.HashToString(FileHash));

                        //borrar .met
                        File.Delete(m_CompleteNameMet);
                        File.Delete(m_CompleteNameMet + ".backup");

                        //							if (File.Exists(m_CompleteNameMet))
                        //							{
                        //								Debug.WriteLine("****[File]***** CAN NOT DELETE .met: " + m_CompleteNameMet);
                        //							}
                    }
                    catch
                    {
                        CLog.Log(Constants.Log.Notify,"ERR1_COMPLETED",m_FileName);
                    }
                }
                else
                {
                    //error al cerrar el fichero
                }
            }
        }