2011-07-18 40 views
1

我有一個windows服務,它將文件與元數據(FIDEF)和相應的視頻文件相結合,並使用XSLT轉換XML(FIDEF)。c#服務重命名文件!

我得到FIDEF的文件目錄列表,如果存在一個同名的視頻文件,它會翻譯它。這工作正常,但它在計時器上搜索每一分鐘。我試圖處理相同文件名進入輸入目錄但已經在輸出目錄中的情況。我只是讓它將輸出名稱更改爲(複製),因此如果有另一個文件進入,我應該得到(複製)(複製).mov,但服務不會以輸出中相同目錄的文件名開始,然後似乎沒有拿起任何新的文件。

任何幫助將是偉大的,因爲我已經嘗試了一些沒有好結果的東西。我相信它的重命名方法,但是我已經將大部分代碼放在了清理問題或其他方面。 (原諒一些名字只是嘗試不同的事情)。

private void getFileList() 
    { 
     //Get FILE LIST FROM Directory 
     try 
     { 
      // Process Each String/File In Directory 
      string result; 
      //string filename; 
      filepaths = null; 
      filepaths = Directory.GetFiles(path, Filetype); 

      foreach (string s in filepaths) 
      { 

       for (int i = 0; i < filepaths.Length; i++) 
       { 
        //Result Returns Video Name 
        result = Path.GetFileNameWithoutExtension(filepaths[i]); 
        FileInfo f = new FileInfo(filepaths[i]); 

        PreformTranslation(f, outputPath + result , result); 


       } 
      } 

     } 
     catch (Exception e) 
     { 
      EventLog.WriteEntry("Error " + e); 
     } 


    } 

    private void MoveVideoFiles(String Input, String Output) 
    { 
     File.Move(Input, Output); 

    } 
    private string GetUniqueName(string name) 
    { 


     //Original Filename 
     String ValidName = name; 
     //remove FIDEF from filename 
     String Justname1 = Path.GetFileNameWithoutExtension(name); 
     //get .mov extension 
     String Extension2 = Path.GetExtension(Justname1); 
     //get filename with NO extensions 
     String Justname = Path.GetFileNameWithoutExtension(Justname1); 
     //get .Fidef 
     String Extension = Path.GetExtension(name); 
     int cnt = 0; 

     //string[] FileName = Justname.Split('('); 
     //string Name = FileName[0]; 

     while (File.Exists(ValidName)==true) 
     { 
      ValidName = outputPath + Justname + "(Copy)" + Extension2 + Extension; 
      cnt++; 

     } 
     return ValidName; 
    } 
    private string getMovFile(string name) 
    { 
     String ValidName = name; 
     String Ext = Path.GetExtension(name); 
     String JustName = Path.GetFileNameWithoutExtension(name); 

     while(File.Exists(ValidName)) 
     { 
      ValidName = outputPath + JustName + "(Copy)" + Ext; 
     } 
     return ValidName; 
    } 



    //Preforms the translation requires XSL & FIDEF name. 
    private void PreformTranslation(FileInfo FileName, String OutputFileName , String result) 
    { 

     string FidefName = OutputFileName + ".FIDEF"; 
     String CopyName; 
     String copyVidName = outputPath + result; 

      XslCompiledTransform myXslTransform; 
      myXslTransform = new XslCompiledTransform(); 
      try 
      { 
       myXslTransform.Load(XSLname); 

      } 
      catch 
      { 
       EventLog.WriteEntry("Error in loading XSL"); 
      } 
      try 
      { //only process FIDEF's with corresponding Video file 
       if (AllFidef == "no") 
       { 
        //Check if video exists if yes, 
        if (File.Exists(path + result)) 
        { 
         //Check for FIDEF File Already Existing in the Output Directory. 
         if (File.Exists(FidefName)) 
         { 
          //Get unique name 
          CopyName = GetUniqueName(FidefName); 
          copyVidName= getMovFile(copyVidName); 


          //Translate and create new FIDEF. 

          //double checking the file is here 
          if (File.Exists(outputPath + result)) 
          { 
           myXslTransform.Transform(FileName.ToString(), CopyName); 
           File.Delete(FileName.ToString()); 
           MoveVideoFiles(path + result, copyVidName); 

          } 
          ////Move Video file with Corresponding Name. 

         } 


         else 
         { //If no duplicate file exsists in Directory just move. 
          myXslTransform.Transform(FileName.ToString(), OutputFileName + ".FIDEF"); 
          MoveVideoFiles(path + result, outputPath + result); 
         } 
        } 

        } 
       else 
       { 
        //Must have FIDEF extension 
        //Processes All FIDEFS and moves any video files if found. 
        myXslTransform.Transform(FileName.ToString(), OutputFileName + ".FIDEF"); 
        if (File.Exists(path + result)) 
        { 
         MoveVideoFiles(path + result, outputPath + result); 
        } 


       } 
      } 
      catch (Exception e) 
      { 
       EventLog.WriteEntry("Error Transforming " + "FILENAME = " + FileName.ToString() 
        + " OUTPUT_FILENAME = " + OutputFileName + "\r\n" +"\r\n"+ e); 

      } 

     } 
+0

爲什麼你有內部for循環?它基本上重複了'foreach'。 –

回答

1

你的代碼有很多錯誤。 getFileList有不需要的內部for循環爲起始者。擺脫它。您的foreach迴路有s,它可以取代for迴路中的filepaths[i]。另外,不要執行outputPath + result來創建文件路徑。請使用Path.Combine(outputPath, result),因爲Path.Combine會爲您處理目錄字符。此外,您需要爲getFileList提出一個更好的名稱,因爲這不是該方法的作用。不要讓你的方法名稱騙子。我想簡單地擺脫MoveVideoFiles。編譯器也可能也是。

GetUniqueName只適用於如果您的文件名是name.mov.fidef,我假設它是。儘管如此,你真的需要更好的變量名稱,否則它將在稍後維護一個夜晚。我將擺脫while循環條件中的== true,但這是可選的。 while內的分配是您的文件被覆蓋的原因。您始終會生成相同的名稱(something(Copy).mov.fidef),並且據我所知,如果該文件存在,我認爲您會將堆棧永久循環。您需要修復該循環以生成新名稱(並且不要忘記Path.Combine)。也許是這樣的(注意,這是未經測試):

int copyCount = 0; 
while (File.Exists(ValidName)) 
{ 
    const string CopyName = "(Copy)"; 
    string copyString = copyCount == 0 ? CopyName : (CopyName + "(" + copyCount + ")"); 
    string tempName = Justname + copyString + Extension2 + Extension; 
    ValidName = Path.Combine(outputPath, tempName); 
    copyCount++; 
} 

這產生something(Copy).mov.fidef的第一個副本,something(Copy)(2).mov.fidef第二,依此類推。也許不是你想要的,但你可以做出調整。

在這一點上,你有很多事情要做。 getMovFile看起來好像它可以以與GetUniqueName相同的方式使用工作。你會發現它。祝你好運。

+0

是的,你的代碼很好用! (添加copyString到tempName),感謝您對變更和提示的幫助!真的很有幫助,應該儘量不要去學習壞習慣。 :) – user685590

+0

優秀。樂意效勞。 –