예제 #1
0
파일: File.cs 프로젝트: elnomade/hathi
 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 m_Hash, ref 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=string.Concat(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=string.Concat(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
     }
     }
 }
예제 #2
0
파일: FilesList.cs 프로젝트: elnomade/hathi
 private bool m_LoadFilesFromFolder(string folder/*,bool refreshing*/)
 {
     if (!Directory.Exists(folder)) return false;
     string [] ficheros=Directory.GetFiles(folder);
     DateTime date;
     string name;
     if (m_EdonkeyHash==null) m_EdonkeyHash=new CHash();
     foreach (string file in ficheros)
     {
     // 0 Kb file are ignored, avoid a crash
     FileInfo filInfo = new FileInfo(file);
     if ((filInfo.Length == 0)||
             ((filInfo.Attributes&(FileAttributes.Hidden|FileAttributes.System))!=0)) continue;
     date=File.GetLastWriteTime(file).ToUniversalTime();
     name=Path.GetFileName(file);
     CKnownFileAttributes Atributos;
     if ((Atributos=m_IsKnown(name,date))!=null)
     {
         //if (refreshing) continue;
         if (!m_Contains(Atributos.FileHash))
         {
             CElement Element=new CElement();
             Element.File=new CFile(Atributos.FileHash,Atributos.Date,folder,name,Atributos.Size, Atributos.Priority, Atributos.Permisions, Atributos.HashSet, Atributos.Comment, Atributos.Rating);
             Element.SourcesList=null;
             Element.Statistics=new CFileStatistics();
             this.m_FileList.Add(Element);
             CKernel.NewSharedFile(Element);
         }
         //if (!m_Contains(Atributos.FileHash))this.m_FileList.Add(Element);
     }
     else //new file
     {
         m_EdonkeyHash.AddFile(file);
     }
     }
     return true;
 }