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 } } }
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; }