2017-01-04 7 views
-1

ファイルをいくつでもドラッグしたい実行ファイルを作成しました。これらすべてのファイルの最初の15文字を削除します。これは、期待通りに多数のファイルの名前を変更していますが、後でエラーを投げます。実行可能ファイルに複数のファイルをドロップC#

「Unhandeled例外:System.IndexOutOfRangeException:インデックスが配列の範囲外であったRemoveTimeStampMultipleFiles.Program.Mainで(文字列[]引数)」

I 2つのファイルをドラッグすると、それは第3探しています?

また、最大99の代わりに無限のファイルを許可する方法はありますか?

using System; 
using System.IO; 

namespace RenameVersion2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args.Length == 0) 
       return; // return if no file was dragged onto exe 


      for (int i = 0; i < 99; i++) 
      { 
       if (args[i].Length == 0) 
        System.Environment.Exit(0); 

       string MyString = Path.GetFileNameWithoutExtension(args[i]); 
       String NewFileName = MyString.Remove(0, 15); 


       string path = Path.GetDirectoryName(args[i]) 
        + Path.DirectorySeparatorChar 
        + MyString 
        + Path.GetExtension(args[i]); 

       string newPath = Path.GetDirectoryName(args[i]) 
        + Path.DirectorySeparatorChar 
        + NewFileName 
        + Path.GetExtension(args[i]); 


       File.Move(path, newPath); 
      } 


      System.Environment.Exit(0); 
     } 
    } 
} 
+1

対です。また、プログラム終了時に 'Environment.Exit'を持つ理由もなく、プログラムはすでに終了しています。 argsとして渡された全てのファイルに対して – Servy

+0

( 'args ')' args [i] '呼び出しを' arg'に置き換えてください。例外として、デバッグを試しましたか?ファイル名が15文字未満の場合はどうなりますか? – Kolichikov

+3

@Kolichikovは 'foreach'で正しい解決策を持っていますが、少なくともfor(i = 0; i

答えて

3

あなたのアプリケーションは、あなたのiループは0から98までの処理は、しかし、多くの引数が渡された後、それがされていない次に進むしようとするためあなたのエラーが発生行くので、正確に99の引数を期待しているように見えます。代わりにこれを試してみてください:

using System; 
using System.IO; 

namespace RenameVersion2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      foreach (var arg in args) 
      { 
       if (arg.Length == 0) 
        System.Environment.Exit(0); 

       string MyString = Path.GetFileNameWithoutExtension(arg); 
       String NewFileName = MyString.Remove(0, 15); 


       string path = Path.GetDirectoryName(arg) 
        + Path.DirectorySeparatorChar 
        + MyString 
        + Path.GetExtension(arg); 

       string newPath = Path.GetDirectoryName(arg) 
        + Path.DirectorySeparatorChar 
        + NewFileName 
        + Path.GetExtension(arg); 


       File.Move(path, newPath); 
      } 


     } 
    } 
} 
1

あなたは、あなたの代わりにfor-loop範囲外に行くの利用可能インデックスの上に反復するように修正する必要があります。

for (int i = 0; i < args.Length; i++) 
      { 
       if (args[i].Length == 0) 
        System.Environment.Exit(0); 

       string MyString = Path.GetFileNameWithoutExtension(args[i]); 
       String NewFileName = MyString.Remove(0, 15); 


       string path = Path.GetDirectoryName(args[i]) 
        + Path.DirectorySeparatorChar 
        + MyString 
        + Path.GetExtension(args[i]); 

       string newPath = Path.GetDirectoryName(args[i]) 
        + Path.DirectorySeparatorChar 
        + NewFileName 
        + Path.GetExtension(args[i]); 


       File.Move(path, newPath); 
      } 

違いは、コレクション内のすべてのアイテムを取得したいので、ちょうど `foreach`ループを使用し、ここで

for (int i = 0; i < args.Length; i++) 

for (int i = 0; i < 99; i++) 
関連する問題