c# - 如何使用 C# 找到通过 USB 电缆连接的相机,然后我可以复制存储的图像
问题描述
我想通过 USB 电缆将相机连接到计算机,并将图像从相机的 SD 卡复制到计算机。我找不到图像。我想检测任何相机,而不仅仅是佳能……但我需要先解决佳能。(从相机中取出 SD 卡不是一个可用的解决方案。)
使用 USB 电缆将相机连接到计算机时,相机会显示在“此 PC”文件夹下。但是“这台电脑”不是一个普通的文件夹,而是一个特殊的文件夹,它不会出现在任何正常路径下。Windows 显然使用“::{20D04FE0-3AEA-1069-A2D8-08002B30309D}”在内部访问它,但我无法在 C# 中使用它。指向它的环境变量返回“”,并记录为这样。我尝试使用 DriveInfo.GetDrives() 列出所有磁盘驱动器。但是相机没有出现......显然它只是一个设备而不是驱动器(即使当你点击它时你会看到一个文件夹视图)。
我能找到的访问佳能相机图像的唯一参考资料都使用佳能 SDK,该 SDK 仅适用于他们的 EOS 型号相机以提供完整的远程控制。
设备:使用 Visual Studio 2019、C#、Windows 10 Pro 和佳能 PowerShot SX700 HS 相机
目的: 我正在尝试为一位年长的朋友制作一个程序,以便他可以轻松地将照片下载到他的计算机上。他知道如何使用 USB 电缆连接相机,但打开文件夹、复制、拖放等让他感到困惑。它必须是全自动的...连接相机和C#程序将所有图片和视频复制到计算机硬盘驱动器,然后打开“Windows资源管理器”到硬盘驱动器上的目标文件夹。直接访问 SD 卡(将其从相机中移除)不是一种选择,因为我的朋友有身体限制,这会阻止它。
解决方案
使用此脚本和来自“Ralf Beckers”的 nuget 包“MediaDevices”,您可以在下面的脚本中复制相机中的所有文件。只需确保更改“设备名称”、@“\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();
}
}
您可以使用 foreach 循环索引更多文件device.GetDirectories(@"\Internal Storage\")
并运行它们。
感谢“@ZackOfAllTrades”让我注意到这个 nuget 数据包
推荐阅读
- typescript - React.memo 和打字稿
- r - 如何将 covid19.analytics 中的 live.map 功能添加到闪亮的应用程序中?
- java - Leetcode #11 装水最多的容器:为什么要使用“else”
- kubernetes - 我在 gitlab 中的自动 devops 管道不起作用
- php - 通过维基数据获取比利时的城市列表
- mysql - 当使用触发器更改另一个字段时,从表中更改字段的值
- python - 确定每组的连续日期期间
- excel - 将所有 pdf 文件移动到新文件夹
- laravel - 在 laravel 上使用 like 无法显示日期搜索
- python - Python列表根据文本获取唯一元素