Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 部署程序时System.ArgumentOutOfRange异常_C#_Windows_Visual Studio 2010 - Fatal编程技术网

C# 部署程序时System.ArgumentOutOfRange异常

C# 部署程序时System.ArgumentOutOfRange异常,c#,windows,visual-studio-2010,C#,Windows,Visual Studio 2010,目前我正在开发一个程序,可以在连接时检测USB设备。将该设备的所有文件和目录复制到指定文件夹。所有这些都有效。我建立了这个程序,没有问题。当我在我的Windows7笔记本电脑上运行.exe时(只有一个分区),程序会执行它应该执行的操作。当我在另一台Windows 7笔记本电脑(有两个分区)和一台Windows vista笔记本电脑(有两个分区)上测试同一程序时,我收到以下错误消息(荷兰语): 如果我检查代码:第70行 编辑:此函数将被调用/接收Windows 7操作系统的消息 prote

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

如果我检查代码:第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行

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

编辑:
\lstu中,pictures
是程序启动时放入其中的三个图片框

 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);
        }
    }
在此之后,我只需要读出
volumeDeviceClass.Devices
WARE只是其中的一项!因为我的程序让你一次只能在USB设备上注册


谁能告诉我是什么原因导致了这个错误。因为我想不出一个,但可能是一个bug?

这主要是一个猜测,但我认为在某些情况下,
位置
变量没有被设置。尝试更改此选项:

if (volumeDeviceClass.Devices[position].IsUsb)
对此

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

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

中,如果(((卷)已连接卷.设备[i]).LogicalDrive!=LogicalDrive)
您使用
i
作为索引,而不是
j

谢谢马特的快速回复。。。我会试试看,然后公布结果。图片中总是有三个副本。。。在满负荷的情况下,它被填满了。尝试了马特建议的解决方案。不起作用,还是一样的错误。通过调试器检查,
lstupictures
将被填充,其中包含三个PictureBox。更多信息:在插入新设备时调用loadDownItems()。在
\u already connected volumes
中,当程序启动时,将存储连接的设备和硬盘。因此,当调用LoadDownItems()时,我填充
volumeDeviceClass.Devices
。我交叉检查这两个设备,检查哪个设备是新的,然后检查它是否是USB设备。我们欢迎其他想法或解决方案来解决这个问题。感谢Martijn
设备的类型是什么?
设备
是一种返回
列表
的方法,类
设备
包含有关usb设备或硬盘(如naam、logicaldrive等)的信息,您可以检查
\u alreadyConnectedVolumes.Devices[i]
这里的设备计数可能小于
i
,您可以检查
i
j
i
当程序在我的笔记本电脑上启动时,不应大于
j
@amarplasture
\u已连接卷。设备[i]
包含C:\、D:\和E:\驱动器。当
volumeDeviceClass.Devices
被填充时,它包含C:\、D:\、E:\和F:\驱动器,最后一个是我想使用的newley连接USB驱动器是的,msdn论坛上也有人注意到了这一点。但没有解决问题。但通过注意到这个问题,我发现er的for循环总的来说是有问题的。。。为了解决这个问题,让你们所有人都发帖。for循环并没有达到他们想要的效果。对于只有一个分区的pc来说,这不是问题。对于多个分区,它给出了错误,这段代码修复了我原来的问题!
if (volumeDeviceClass.Devices[position].IsUsb)
if (position != -1 && volumeDeviceClass.Devices[position].IsUsb)