部署程序时出现System.ArgumentOutOfRangeException

时间:2012-01-18 15:15:25

标签: c# windows visual-studio-2010

目前我正在研究一种可以在连接时检测USB设备的程序。将该设备的所有文件和目录复制到指定的文件夹。所有这一切都有效。我建立这个程序,那里没问题。当我在我的Windows 7笔记本电脑上运行.exe(带有一个分区)时,该程序会执行它应该执行的操作。当我在另一台Windows 7笔记本电脑(带有两个分区)和Windows Vista笔记本电脑(带有两个分区)上测试相同的程序时,我收到此错误消息(荷兰语):

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行的代码

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

_lstPictures中的

编辑是程序启动时放入的三个Picturebox。

 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:\ - &gt;硬盘
  • D:\ - &gt; DVD-RW-站

volumeDeviceClass.Devices存在:

  • C:\ - &gt;硬盘
  • D:\ - &gt; DVD-RW-站
  • E:\ - &gt;我的USB驱动器 - &gt;这是我可以毫无问题地采取行动!

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

_alreadyConnectedVolumes.Devices存在:

  • C:\ - &gt; harddisk(分区1 =主要)
  • D:\ - &gt; harddisk(分区2)
  • E:\ - &gt; DVD-RW-站

volumeDeviceClass.Devices存在:

  • C:\ - &gt; harddisk(分区1 =主要)
  • D:\ - &gt; harddisk(分区2)
  • E:\ - &gt; DVD-RW-站
  • G:\ - &gt;我的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只是其中的一个项目!因为我的progrem让你一次只能注册USB设备。

任何人都可以告诉我导致错误的原因。原因不能想到一个但可能是一个错误?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

if (volumeDeviceClass.Devices[position].IsUsb)

到这个

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

修改:同时确保_lstPictures中有三条记录。