我试图从Android手机上的文件夹中获取项目。
然而,FolderBrowserDialog不允许我从手机中选择一个文件夹。路径看起来像This PC\Xperia Z3 Compact\SD Card\Music
选择我目前正在使用的文件夹:
private void button_Click(object sender, EventArgs e)
{
System.Windows.Forms.FolderBrowserDialog dlg = new System.Windows.Forms.FolderBrowserDialog();
if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
UserFolderLocation = dlg.SelectedPath;
}
else { }
}
然后在搜索文件夹中查找其内容时,我使用:
try
{
folderItems = Directory.GetFiles(directory).Select(f => Path.GetFileNameWithoutExtension(f)).ToArray();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
如果我将路径This PC\Xperia Z3 Compact\SD Card\Music
作为变量插入然后搜索它,则会抛出System.IO.DirectoryNotFoundException
。
如何选择和使用不以c:
,d:
等开头的路径?
答案 0 :(得分:3)
最后我最终使用了shell32库。它具有处理便携式设备的能力(包括并且不包括驱动器号)。
包括shell32.dll
的参考
并包括图书馆:
using Shell32;
然后我使用shell浏览文件夹而不是使用FolderBrowserDialog。这为手机上的文件夹返回一条奇怪的路径,因为我用来测试路径的手机如下所示:
::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\\?\usb#vid_04e8&pid_6860&ms_comp_mtp&samsung_android#6&fee689d&3&0000#{6ac27878-a6fa-4155-ba85-f98f491d4f33}\SID-{20002,SECZ9519043CHOHB01,63829639168}\{013C00D0-011B-0130-3A01-380113012901}
public int Hwnd { get; private set; }
private void button3_Click(object sender, EventArgs e)
{
Shell shell = new Shell();
Folder folder = shell.BrowseForFolder((int)Hwnd, "Choose Folder", 0, 0);
if (folder == null)
{
// User cancelled
}
else
{
FolderItem fi = (folder as Folder3).Self;
UserFolderLocation = fi.Path;
}
}
然后选择在文件夹中搜索其内容:
try
{
Folder dir = shell.NameSpace(directory);
List<string> list = new List<string>();
foreach (FolderItem curr in dir.Items())
{
list.Add(curr.Name);
}
folderItems = list.ToArray();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
答案 1 :(得分:0)
“此PC”仅供用户使用 - 在内部根本不使用。您可以通过在Windows资源管理器中应用第一个标记设置来亲眼看到
此外,Windows会为每个本地设备分配一个驱动器号 - 默认情况下它不显示。 (使用第二个标记设置进行检查)
所以实际上你必须使用(假设你的手机被分配了驱动器F:
)类似F:\SD Card\Music\
。
可能相关:Get List Of Connected USB Devices关于在不知道分配的驱动器号的情况下查找设备的能力。