【问题标题】:Drop multiple files onto executable C#将多个文件拖放到可执行 C#
【发布时间】:2017-01-04 21:53:04
【问题描述】:

我创建了一个可执行文件,我想将任意数量的文件拖到其中。我希望它删除所有这些文件的前 15 个字符。它正在重命名许多文件,但之后会引发错误。

“未处理的异常:System.IndexOutOfRangeException:索引超出了数组的范围。在 RemoveTimeStampMultipleFiles.Program.Main(String[] args)”

当我拖动 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);
        }
    }
}

【问题讨论】:

  • 只需使用foreach 循环,因为您想获取集合中的所有项目。也没有理由在程序结束时有Environment.Exit,程序已经结束了。
  • 对于所有作为 args 传递的文件(假设您只有文件名作为 args),只需使用 foreach(var arg in args),并将 args[i] 调用替换为 arg。至于异常,您是否尝试过调试?当您的文件名长度少于 15 个字符时会发生什么?
  • @Kolichikov 有foreach 的正确解决方案,但至少你应该使用for(i = 0; i &lt; args.Length; i++)。您已经知道args.Length,因为您在上面使用过它;你到底为什么要硬编码高值 99?如果是args.Length == 3,那么在您测试args[i].Length == 0i == 3 的那一刻,您就已经过了args 的末尾。

标签: c# visual-studio executable


【解决方案1】:

您的应用程序似乎需要 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);
            }


        }
    }
}

【讨论】:

    【解决方案2】:

    您需要修复您的 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++)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      相关资源
      最近更新 更多