部署程序时出现System.ArgumentOutOfRangeException

本文关键字:System ArgumentOutOfRangeException 程序 部署 | 更新日期: 2023-09-27 18:20:35

目前我正在开发一个程序,该程序可以在连接时检测USB设备。将该设备的所有文件和目录复制到指定的文件夹中。所有这些都有效。我建立了这个程序,没有问题。当我在我的Windows7笔记本电脑(有一个分区)上运行.exe时,程序会做它应该做的事情。当我在另一台Windows7笔记本计算机(有两个分区)和一台WindowsVista笔记本电脑(两个分区

System.ArgumentOutOfRangeException: De index valt buiten het bereik. Deze mag niet negatief zijn en moet kleiner zijn dan de grootte van de verzameling.
Parameternaam: index
   bij System.ThrowHelper.ThrowArgumentOutOfRangeException()
   bij System.Collections.Generic.List`1.get_Item(Int32 index)
   bij PHL___USB_tool.USBTool.LoadDownloadItems() in C:'Users'2930682'Desktop'ONDERZOEK CopyFormatUSB'MyProgram'PHL - USB tool'PHL - USB tool'USB tool.cs:regel 162
   bij PHL___USB_tool.USBTool.WndProc(Message& m) in C:'Users'2930682'Desktop'ONDERZOEK CopyFormatUSB'MyProgram'PHL - USB tool'PHL - USB tool'USB tool.cs:regel 70
   bij System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   bij System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   bij System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

如果我检查我的代码:对于第70行

编辑:此函数将被调用/接收Windows 7操作系统的消息。

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == Native.WM_DEVICECHANGE)
        {
            if (m.WParam.ToInt32() == Native.DBT_DEVICEARRIVAL)
            {
                if (!_blnLoading)
                {
                     switch (tabControl1.SelectedIndex)
                    {
                        case 0: SetProgress(_lstPictures);
                                lblCopies.Visible = false;
                                LoadDownloadItems();
                                break;
                        case 1: SetProgress(_lstPictures2);
                                LoadUploadItems();
                                break;
                        case 2: SetProgress(_lstPictures3);
                                LoadDeleteItems();
                                break;
                    }
                }
            }
            else if (m.WParam.ToInt32() == Native.DBT_DEVICEREMOVECOMPLETE)
            {
                _blnLoading = false;
                _alreadyConnectedVolumes = null;
                _alreadyConnectedVolumes = new VolumeDeviceClass();
            }
        }
        base.WndProc(ref m);
    }

和我的162号代码

EDIT:此函数在调用LoadDownloadItems()时交叉检查程序启动时填充的_alreadyConnectedVolumes.DevicesvolumeDeviceClass.Devices。检查并选择新添加的设备。之后,检查它是否是具有IsUsb功能的USB设备。

编辑:_lstPictures中,程序启动时会放入三个图片框。

 private void LoadDownloadItems()
    {
        _blnLoading = true;
        lblErrorDestination.Visible = false;
        picErrorDestination.Visible = false;
        _intFilesCopied = 0;
        _intDirectoriesCopied = 0;
        VolumeDeviceClass volumeDeviceClass = new VolumeDeviceClass();
        int position = -1; // need it for control, when to stop the for-loop
        for (int i = 0; i < volumeDeviceClass.Devices.Count; i++)
        {
            if (position != -1)
                break;
            else
            {
                string logicalDrive = ((Volume)volumeDeviceClass.Devices[i]).LogicalDrive;
                for (int j = 0; j < _alreadyConnectedVolumes.Devices.Count; j++)
                {
                    if (((Volume)_alreadyConnectedVolumes.Devices[i]).LogicalDrive != logicalDrive)
                    {
                        position = i;
                        break;
                    }
                }
            }
        }
        // you don't need to check the position!
        // cause every new device during run-time, will be a removable device or usb-device
        if (position != -1 && volumeDeviceClass.Devices[position].IsUsb)
        {
            _connectedDevice = volumeDeviceClass.Devices[position];
            _strLogicalDrive = ((Volume) _connectedDevice).LogicalDrive;
            _lstPictures[0].Image = Properties.Resources.Pass;
            lblFirst.Text = "Usb-device (" + _strLogicalDrive + @"') found";
            lblFirst.Refresh();
            RefreshProgress(_lstPictures);
            if (_strDestination != null)
            {
                GetDirectories(_strLogicalDrive);
                _lstPictures[1].Image = Properties.Resources.Pass;
                _lstPictures[2].Image = Properties.Resources.Pass;
                RefreshProgress(_lstPictures);
                lblCopies.Visible = true;
                lblCopies.Text = "Files copied: " + _intFilesCopied + "'tDirectories copied: " + _intDirectoriesCopied;
            }
            else
            {
                _lstPictures[1].Image = Properties.Resources.Error;
                _lstPictures[2].Image = Properties.Resources.Error;
                RefreshProgress(_lstPictures);
                lblErrorDestination.Visible = true;
                picErrorDestination.Visible = true;
            }
            UsbEject();
            _lstPictures[3].Image = Properties.Resources.Pass;
            RefreshProgress(_lstPictures);
        }
    }

编辑:一些额外的信息在两台不同的笔记本电脑上再次测试了我的程序。笔记本电脑拥有相同的资源(相同的操作系统(windows 7 service pack 1),均为HP EliteBook 8530p,…)结果如下:

我的笔记本电脑(如果程序运行良好):

_alreadyConnectedVolumes.Devices存在于:

  • C: ''-->硬盘
  • D: ''-->DVD rw电台

volumeDeviceClass.Devices存在于:

  • C: ''-->硬盘
  • D: ''-->DVD rw电台
  • E: ''-->我的USB驱动器-->这是我可以毫无问题地执行操作的驱动器

我伴侣的笔记本电脑(我是否收到了本主题中显示的错误):

_alreadyConnectedVolumes.Devices存在于:

  • C: ''-->硬盘(分区1=主)
  • D: ''-->硬盘(分区2)
  • E: ''-->DVD rw电台

volumeDeviceClass.Devices存在于:

  • C: ''-->硬盘(分区1=主)
  • D: ''-->硬盘(分区2)
  • E: ''-->DVD rw电台
  • G: ''-->我的USB驱动器

在这里描述的两种情况下,我使用了相同的USB设备!

编辑:(解决了吗?)这解决了我的问题,我想,如果它真的有效,我明天必须检查一下。但目前,这解决了嵌套循环的问题:

for (int i = 0; i < _alreadyConnectedVolumes.Devices.Count; i++)
        {
            string logicalDrive = ((Volume)_alreadyConnectedVolumes.Devices[i]).LogicalDrive;
            for (int j = 0; j < volumeDeviceClass.Devices.Count; j++)
            {
                if (logicalDrive == ((Volume)volumeDeviceClass.Devices[j]).LogicalDrive)
                    volumeDeviceClass.Devices.RemoveAt(j);
            }
        }

在这之后,我只需要读出volumeDeviceClass.Devices只是其中的一项!因为我的程序让你一次只能在USB设备上注册。

有人能告诉我是什么原因造成的错误吗。因为想不出一个,也许只有一个虫子?

部署程序时出现System.ArgumentOutOfRangeException

if (((Volume)_alreadyConnectedVolumes.Devices[i]).LogicalDrive != logicalDrive)中,使用i而不是j作为索引!

这主要是猜测,但我认为在某些情况下,您的position变量没有被设置。尝试更改:

if (volumeDeviceClass.Devices[position].IsUsb)

到这个

if (position != -1 && volumeDeviceClass.Devices[position].IsUsb)

编辑:还要确保_lstPictures中有三条记录。