2017-01-04 5 views
-1

Я создал исполняемый файл, в который я хочу перетащить любое количество файлов. Я хочу, чтобы он удалил первые 15 символов всех этих файлов. Он переименовывает множество файлов в надежде, но после этого он выдает ошибку.Отбросить несколько файлов на исполняемый файл C#

«Unhandeled Исключение: System.IndexOutOfRangeException:. Индекс находился вне границ массива в RemoveTimeStampMultipleFiles.Program.Main (String [] арг)»

Когда я тащу 2 файлов тогда ищет третий ?

Также есть способ разрешить использование бесконечных файлов, а не максимум 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

Просто используйте 'foreach' петлю, так как вы хотите, чтобы все элементы в коллекции. Также нет причин иметь «Environment.Exit» в конце программы, программа уже заканчивается. – Servy

+0

для всех файлов, переданных как args (при условии, что у вас есть только имена файлов в качестве аргументов), просто используйте 'foreach (var arg in args)' и замените 'args [i]' вызовы на 'arg'. Что касается исключения, вы попробовали отладку? Что происходит, когда ваше имя файла составляет менее 15 символов? – Kolichikov

+3

@ Количиков имеет правильное решение с 'foreach', но по крайней мере вы должны использовать' for (i = 0; i

ответ

3

Ваше приложение, кажется, ожидает ровно 99 аргументов, так как ваш i цикл от 0 до 98. Ваша ошибка происходит потому, что после обработки, однако были приняты многие аргументы, он пытается перейти к следующему, который не существует. Попробуйте вместо этого:

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

Разница здесь

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

против

for (int i = 0; i < 99; i++)