スマホやタブレットで撮った写真をパソコンに取り込みたいと依頼がありました
どうしよう方法がいっぱいあってどれにすればいいか判断に苦しみます USBケーブルで接続 スマートホン連携 近距離通信 google drive フォト bluetooth blip kde connectone driveやgoogle driveのようにいつも自動で同期してくれるといいような気がしますフォトが分かりやすいかなと思っています。写真を撮るパソコンでchromeを立ち上げ、フォトを開く、画像をパソコンにドロップして使うフォトをアプリとしてインストールしておけば、一発で開けますアプリではblipやkde connectがなかなかいいです。ファイルを選択して、共有を開くと、どのアプリで共有するかが選べます。スマホから送信するとパソコンのダウンロードにファイルが保存されますUSBで接続するとエクスプローラで見ることができます。デフォルトではスマホをパソコンに接続するとUSB充電になっています開発者オプションでUSB接続の際にファイル転送にしておくとすぐ開けますしかし、ドライブとしてマウントされていないので自動化してもコマンドプロンプトでは操作ができまません。それならc#でアプリを作ってみよう「MediaDevices」を使うのが気もらしいワンタッチで画像をピクチャーフォルダーにコピーできるようにしました。サブホルダーの指定もできます。同名ファイルはスキップしますこれでスマホの画像がミラーリングできます実行すれば新しい画像のみコピーされます。(バックアップの代わりに使える)端末名や画像格納場所はコンフィグで設定できるので、自分のデバイスに合うよう変更できますusing MediaDevices;using Scripting; //「Microsoft Scripting Runtime」using SHDocVw; // Microsoft Internet Controls(ShellWindows 用)using Shell32; // 参照設定で COM: Microsoft Shell Controls and Automation を追加using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Data.SqlClient;using System.Diagnostics;using System.Drawing;using System.IO;using System.Linq;using System.Net.NetworkInformation;using System.Runtime.InteropServices;using System.Runtime.InteropServices.ComTypes;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Configuration;namespace d_52c{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void StartDate_TextChanged(object sender, EventArgs e) { } private void Form1_Load(object sender, EventArgs e) { SubFolder.Text=Properties.Settings.Default.target; } private void button3_Click(object sender, EventArgs e) { Application.Exit(); } private void button1_Click(object sender, EventArgs e) { int copied = 0; Shell shell = null; try { shell = new Shell(); Shell32.Folder myComputer = shell.NameSpace(17); // 17 でもOK foreach (FolderItem deviceItem in myComputer.Items()) { string devName = deviceItem.Name.ToUpper(); string device1 = Properties.Settings.Default.device1; string device2 = Properties.Settings.Default.device2; string device3 = Properties.Settings.Default.device3; string device4 = Properties.Settings.Default.device4; if (!devName.Contains(device1) && !devName.Contains(device2) && !devName.Contains(device3) && !devName.Contains(device4)) continue; devicename.Text= devName; if (!deviceItem.IsFolder) continue; Shell32.Folder deviceFolder = deviceItem.GetFolder; foreach (FolderItem storageItem in deviceFolder.Items()) { string storageName = storageItem.Name.ToUpper(); if (storageName.Contains("内部共有ストレージ") || storageName.Contains("INTERNAL STORAGE") || storageName == "PHONE") { if (!storageItem.IsFolder) continue; Shell32.Folder storageFolder = storageItem.GetFolder; CopyFromDcim(storageFolder, ref copied); } } } Rmsg.Text= $"完了 {copied} ファイルをコピーしました。"; } catch (Exception ex) { MessageBox.Show("エラー: " + ex.Message + "\n\n" + ex.StackTrace, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { if (shell != null) Marshal.FinalReleaseComObject(shell); } } private void CopyFromDcim(Shell32.Folder dcimParentFolder, ref int copied) { foreach (FolderItem item in dcimParentFolder.Items()) { if (string.Equals(item.Name, "DCIM", StringComparison.OrdinalIgnoreCase)) { if (!item.IsFolder) continue; Shell32.Folder storageFolder = item.GetFolder; CopyFromDcimSub(storageFolder, ref copied); } } } private void CopyFromDcimSub(Shell32.Folder dcimParentFolder, ref int copied) { foreach (FolderItem item in dcimParentFolder.Items()) { string subfolder1 = Properties.Settings.Default.subfolder1; if (string.Equals(item.Name, subfolder1, StringComparison.OrdinalIgnoreCase)) { if (!item.IsFolder) continue; Shell32.Folder storageFolder = item.GetFolder; CopyAllPhotosFromFolder(storageFolder, ref copied); } string subfolder2 = Properties.Settings.Default.subfolder2; if (string.Equals(item.Name, subfolder2, StringComparison.OrdinalIgnoreCase)) { if (!item.IsFolder) continue; Shell32.Folder storageFolder = item.GetFolder; CopyAllPhotosFromFolder(storageFolder, ref copied); } } } private void CopyAllPhotosFromFolder(Shell32.Folder folder, ref int copied) { Boolean already=false; string destDir = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures); if (SubFolder.Text!="") { destDir += "\\" + SubFolder.Text; } if (!System.IO.Directory.Exists(destDir)) { DirectoryInfo di = Directory.CreateDirectory(destDir); } Shell shell = new Shell(); // Shell32.Folder dest = shell.NameSpace(39); Shell32.Folder dest = shell.NameSpace(destDir); foreach (FolderItem fileItem in folder.Items()) { if (fileItem.IsFolder) continue; string ext = Path.GetExtension(fileItem.Name).ToLowerInvariant(); if (ext != ".jpg" && ext != ".jpeg" && ext != ".png") //&& // ext != ".mp4" && ext != ".mov" && ext != ".3gp") continue; // 同名ファイル already = false; if (System.IO.File.Exists(destDir + "\\" + fileItem.Name)) { already = true; } if (already == false) { try { dest.CopyHere(fileItem, 4 | 16); // 4=無提示, 16=進捗ダイアログなし(応答ありにすると遅い) int lag = Int32.Parse(Properties.Settings.Default.lag); System.Threading.Thread.Sleep(lag); copied++; this.Text = $"コピー中... {copied} 件 - {fileItem.Name}"; Application.DoEvents(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"CopyHere失敗: {fileItem.Name} - {ex.Message}"); } } } } private void button2_Click(object sender, EventArgs e) { string destDir = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures); System.Diagnostics.Process.Start("EXPLORER.EXE", destDir); } } }<?xml version="1.0" encoding="utf-8" ?><configuration> <configSections> <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="d_52c.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> </sectionGroup> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /> </startup> <userSettings> <d_52c.Properties.Settings> <setting name="subfolder1" serializeAs="String"> <value>100SHARP</value> </setting> <setting name="subfolder2" serializeAs="String"> <value>Camera</value> </setting> <setting name="device1" serializeAs="String"> <value>P710</value> </setting> <setting name="device2" serializeAs="String"> <value>D-52C</value> </setting> <setting name="device3" serializeAs="String"> <value>S5-SH</value> </setting> <setting name="device4" serializeAs="String"> <value>MTP USB デバイス</value> </setting> <setting name="device5" serializeAs="String"> <value>SH-</value> </setting> <setting name="lag" serializeAs="String"> <value>100</value> </setting> <setting name="target" serializeAs="String"> <value>tablet</value> </setting> </d_52c.Properties.Settings> </userSettings></configuration>