如何从Windows 7上的C#程序读取Android手机上的文件?

lnxxn5zx  于 2022-12-24  发布在  Windows
关注(0)|答案(2)|浏览(266)

当我用USB线将Android手机连接到Windows 7时,Windows会弹出一个窗口,并在Windows资源管理器中显示手机的内部存储空间Computer\HTC VLE_U\Internal storage。但没有与此手机存储空间关联的驱动器号!在Windows资源管理器中,我可以操作文件系统。
我如何从C#程序中操作相同的文件或文件夹?
我测试过了,

DirectoryInfo di = new DirectoryInfo(@"C:\");

有用,但是

DirectoryInfo di = new DirectoryInfo(@"Computer\HTC VLE_U\Internal storage");

失败了。
但是在Windows资源管理器中,它是Computer\HTC VLE_U\Internal storage!没有驱动器号!
是的,这是MTP器械。
我在Stack Overflow中看到了这个answer,但是在运行这段代码之后,返回结果为空

var drives = DriveInfo.GetDrives();
var removableFatDrives = drives.Where(
    c=>c.DriveType == DriveType.Removable &&
    c.DriveFormat == "FAT" && 
    c.IsReady);
var androids = from c in removableFatDrives
    from d in c.RootDirectory.EnumerateDirectories()
    where d.Name.Contains("android")
    select c;

我得到正确的drives。但是android手机的内存不在这里。removableFatDrivesandroids对我来说都是空的。

vyswwuz2

vyswwuz21#

我使用了NugetPackage“Ralf Beckers V1. 8. 0的媒体设备”,这使我很容易将照片从设备复制到电脑上,反之亦然。

public class Program
{
    static void Main(string[] args)
    {
        var devices = MediaDevice.GetDevices();
        using (var device = devices.First(d => d.FriendlyName == "Galaxy Note8"))
        {
            device.Connect();
            var photoDir = device.GetDirectoryInfo(@"\Phone\DCIM\Camera");

            var files = photoDir.EnumerateFiles("*.*", SearchOption.AllDirectories);

            foreach (var file in files)
            {
                MemoryStream memoryStream = new System.IO.MemoryStream();
                device.DownloadFile(file.FullName, memoryStream);
                memoryStream.Position = 0;
                WriteSreamToDisk($@"D:\PHOTOS\{file.Name}", memoryStream);
            }
            device.Disconnect();
        }

    }

    static void WriteSreamToDisk(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();
        }
    }
}
tjrkku2a

tjrkku2a2#

使用ZackOfAllTrades的代码,我在调用MediaDevice.DownloadFile(string,Stream)时遇到了OutOfMemoryException
[1]转到项目属性,设置项目为构建x64,这似乎摆脱了OutOfMemoryException;我能够开始复制1GB到2GB之间的文件,没有任何问题。
[2]然而,当我开始复制2.5GB的文件时,ZackOfAllTrades的WriteStreamToDisk()实用程序函数就开始抱怨流太长。
DownloadFile接受一个Stream对象,它不需要是一个MemoryStream,所以我把它切换成了一个FileStream对象:

static void Main(string[] args)
{
    string DeviceNameAsSeenInMyComputer = "Mi Note 10 Pro";

    var devices = MediaDevice.GetDevices();

    using (var device = devices.Where(d => d.FriendlyName == DeviceNameAsSeenInMyComputer || d.Description == DeviceNameAsSeenInMyComputer).First())
    {
        device.Connect();
        var photoDir = device.GetDirectoryInfo(@"\Internal shared storage\DCIM\Camera");
        var files = photoDir.EnumerateFiles("*.*", SearchOption.TopDirectoryOnly);

        foreach (var file in files)
        {
            string destinationFileName = $@"F:\Photo\{file.Name}";
            if (!File.Exists(destinationFileName))
            {
                using (FileStream fs = new FileStream(destinationFileName, FileMode.Create, System.IO.FileAccess.Write))
                {
                    device.DownloadFile(file.FullName, fs);
                }
            }

            
        }
        device.Disconnect();
    }

    Console.WriteLine("Done...");
    Console.ReadLine();
}

当我使用ZackOfAllTrades的代码时,VS分析器显示内存消耗大约是文件大小的2.5倍。如果文件大小为1.5GB,内存消耗大约为4GB,但如果直接复制到文件系统,内存消耗可以忽略不计(〈50 mb)。
另一个问题是MediaDevice.FriendlyName。我确信我的小米Note 10 Pro不支持FriendlyName。对我有效的是MediaDevice.Description

相关问题