2011-07-18 1 views
1

私はメタデータ(FIDEF)と対応するビデオファイルを含むファイルを受け取り、XSLTを使用してXML(FIDEF)を翻訳するWindowsサービスを持っています。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がディレクトリ文字を処理するため、代わりにPath.Combine(outputPath, result)を使用してください。また、getFileListのより良い名前を考え出す必要があります。なぜなら、それはメソッドがまったく何をするのではないからです。あなたのメソッド名は嘘つきにしないでください。

私は単にMoveVideoFilesを取り除きます。コンパイラだけかもしれない。

GetUniqueNameファイル名がname.mov.fidefの形式である場合にのみ動作します。これは私が想定しているものです。あなたは本当により良い変数名が必要です。そうでなければ、後でメンテナンス用の夜間ウェアになります。私はをループ状態のwhileに取り除きますが、これはオプションです。 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.fidefsomething(Copy)(2).mov.fidefを生成し、そして:たぶん、このような何かが(これは未検証であることに注意します)。あなたが望むものではないかもしれませんが、あなたは調整を加えることができます。

この時点では、たくさんのことがあります。 getMovFileは、GetUniqueNameと同じ方法で作業を使用できるかのように見えます。あなたはそれを理解するでしょう。がんばろう。

+0

あなたのコードはうまく動作します! (tempStringにcopyStringを追加しました)、変更とヒントのヘルプありがとう!本当に大きな助け、悪い習慣を学ばないようにしようとする必要があります。 :) – user685590

+0

優れています。喜んで助けてください。 –

関連する問題