2017-01-04 4 views
-1

Ich habe eine ausführbare Datei erstellt, in die ich beliebig viele Dateien ziehen möchte. Ich möchte, dass die ersten 15 Zeichen aller dieser Dateien entfernt werden. Es benennt zahlreiche Dateien wie erhofft um, aber es wirft danach einen Fehler auf.Mehrere Dateien auf eine ausführbare Datei kopieren C#

"Unhandeled Ausnahme: System.IndexOutOfRangeException. Index außerhalb der Grenzen des Arrays wurde auf RemoveTimeStampMultipleFiles.Program.Main (String [] args)"

Wenn ich 2 Dateien ziehen ist es dann die Suche nach einem dritten ?

Gibt es auch eine Möglichkeit, unbegrenzte Dateien anstelle von maximal 99 zu erlauben?

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

Nur eine 'foreach' Schleife verwenden, da Sie alle Elemente in der Sammlung erhalten möchten. Es gibt auch keinen Grund, "Environment.Exit" am Ende des Programms zu haben, das Programm endet bereits. – Servy

+0

für alle Dateien, die als Argumente übergeben werden (vorausgesetzt, Sie haben nur Dateinamen als Argumente), verwenden Sie einfach 'foreach (var arg in args)' und ersetzen Sie 'args [i]' Aufrufe mit 'arg'. Was die Ausnahme betrifft, haben Sie versucht, zu debuggen? Was passiert, wenn Ihr Dateiname weniger als 15 Zeichen lang ist? – Kolichikov

+3

@Kolichikov hat die richtige Lösung mit 'foreach', aber zumindest sollten Sie 'for (i = 0; i

Antwort

3

Die Anwendung wird genau 99 Argument erwartet werden, da Ihre i Schleife von 0 bis 98 geht Ihr Fehler tritt auf, weil nach der Verarbeitung jedoch viele Argumente übergeben wurden sie auf den nächsten Fortschritt versucht, was nicht da ist. Versuchen Sie stattdessen:

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

Sie müssen reparieren Ihren for-loop so, dass sie die verfügbaren Indizes iteriert statt außerhalb der Reichweite geht.

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

Der Unterschied hier ist

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

vs

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