如何找到通过 USB 电缆连接的相机,使用 C#,然后我可以复制存储的图像

How to find camera attached by USB cable, using C#, so I can then copy stored images

我想通过USB 数据线将相机连接到电脑,并将相机SD 卡中的图像复制到电脑。我无法找到图像。我想检测任何相机,而不仅仅是佳能......但我需要先解决佳能问题。 (从相机中取出 SD 卡不是可用的解决方案。)

当使用 USB 数据线将相机连接到计算机时,相机会显示在 "This PC" 文件夹下。但是 "This PC" 不是一个普通的文件夹,而是一个特殊的文件夹,不会出现在任何正常路径下。 Windows 显然使用“::{20D04FE0-3AEA-1069-A2D8-08002B30309D}”在内部访问它,但我找不到在 C# 中使用它的方法。指向它的环境变量 returns "",并记录在案。我尝试使用 DriveInfo.GetDrives() 列出所有磁盘驱动器。但是相机没有出现...显然它只是一个设备而不是一个驱动器(即使当你点击它时你会看到一个文件夹)。

我能找到的关于访问佳能相机图像的唯一参考资料都是使用佳能 SDK,该 SDK 仅适用于其 EOS 型号相机以提供完全远程控制。

设备: 使用 Visual Studio 2019、C#、Windows 10 Pro 和 Canon PowerShot SX700 HS 相机

用途: 我正在尝试为一位年长的朋友制作一个程序,以便他可以轻松地将照片下载到他的计算机上。他知道如何使用 USB 数据线连接相机,但打开文件夹、复制、拖放等操作让他感到困惑。它必须是全自动的...连接相机和 C# 程序将所有图片和视频复制到计算机硬盘驱动器,然后打开 "windows explorer" 到硬盘驱动器上的目标文件夹。直接访问 SD 卡(将其从相机中取出)不是一种选择,因为我朋友的身体限制阻止了它。

将相机(或智能手机)连接到计算机时,有两种结果:

  1. 相机就像 U 盘或其他大容量存储设备。那是理想的情况。
  2. 相机不像 U 盘。这意味着您需要制造商提供的特殊程序才能访问图片。

如果是情况 1,它确实像每个 U 盘一样工作。

如果是情况2,那么程序是唯一的方法。您完全它提供的内容。

就我个人而言,我绝不会购买属于案例 2 的相机。虽然我理解不希望普通用户删除他们不应该与之交互的文件夹的想法,但对特殊程序的需求确实是一个很大的问题麻烦。

使用此脚本和来自 "Ralf Beckers" 的 nuget 包 "MediaDevices",您可以像下面的脚本一样从相机复制所有文件。只需确保将 "DEVICE NAME"、@"\Internal Storage\" 和位置更改为我的桌面 :)":

using System.IO;
using MediaDevices;

private void button3_Click(object sender, EventArgs e)
        {
            var devices = MediaDevice.GetDevices();
            foreach(var device in devices)
            {
                MessageBox.Show(device.FriendlyName);
                if (device.FriendlyName == "DEVICE NAME")
                {
                    device.Connect();

                    var drs = device.GetFiles(@"\Internal Storage\");
                    foreach (string str in drs)
                    {
                        MessageBox.Show(str);
                        MemoryStream memoryStream = new System.IO.MemoryStream();
                        device.DownloadFile(str, memoryStream);
                        memoryStream.Position = 0;
                        WriteStreamToDisk(@"C:\Users\nikla\Desktop\temp\" + str.Substring(str.LastIndexOf("\") + 1), memoryStream);
                    }

                }
            }

        }

        static void WriteStreamToDisk(string filePath, MemoryStream memoryStream)
        {
            using (FileStream file = new FileStream(filePath, FileMode.Create, System.IO.FileAccess.Write))
            {
                byte[] bytes = new byte[memoryStream.Length];
                memoryStream.Read(bytes, 0, (int)memoryStream.Length);
                file.Write(bytes, 0, bytes.Length);
                memoryStream.Close();
            }
        }

您可以使用 device.GetDirectories(@"\Internal Storage\") 和 运行 通过 foreach 循环索引更多文件。

感谢“@ZackOfAllTrades”让我注意到这个 nuget 数据包