2012-06-13 2 views
3

Когда iPhone подключен к компьютеру Win7, изображения можно просматривать с помощью проводника (и диалогового окна открытого файла моего приложения). Однако расположение файла не содержит буквы диска.Можно ли считывать изображения с iPhone программно с помощью CreateFile в Windows?

Например Computer\Apple iPhone\Internal Storage\DCIM\800AAAAA\IMG_0008.JPG вместо E:\DCIM\800AAAAA\IMG_0008.JPG, который является общим для sdcards, USB дисков, и т.д. ...

Я попытался с помощью CreateFileW читать изображения с iPhone, но он терпит неудачу с «(Код ошибки: 3) Система не может найти указанный путь.' Я также пытался получить доступ к ним с помощью Chrome, и он тоже не работает.

Любые предложения?

ответ

2

Папка на самом деле называется виртуальной папкой и не имеет полного пути к файловой системе. Вам нужно будет использовать элемент оболочки, возвращенный из диалогового окна open, чтобы получить содержимое файла, а не использовать CreateFile.

Данные должны быть доступны, но вы должны следовать инструкциям от the MSDN documentation. Я уверен, что есть, вероятно, лучшие примеры (так как это дает только рекомендации).

редактировать грубый процесс, чтобы получить IShellItem от IFileOpenDialog, а затем привязать к потоку, а затем прочитать поток (предполагая, что только чтение) - имейте в виду, что этот код довольно много без обработки ошибок или проверки или безопасность:

if (pitem->GetDisplayName(SIGDN_NORMALDISPLAY, &destName) == S_OK) { 
    std::cout << destName << std::endl; 
    CoTaskMemFree(destName); 
} 
IStream *pistream; 
if (pitem->BindToHandler(0, BHID_Stream, IID_PPV_ARGS(&pistream)) == S_OK) { 
    char input[1024]; 
    long to_read = 1024; 
    unsigned long read; 
    while (S_OK == pistream->Read(input, to_read, &read)) { 
     std::cout << input << std::endl; 
    } 
    pistream->Release(); 
} 
pitem->Release(); 
+0

Большое спасибо !!! –

0

чаще всего такое устройство вставляется в Windows Explorer, как пространство имен расширения оболочки и не как флешку с буквой диска. Большинство нормальных файловых команд, таких как CopyFile (..), FindFirst() или GetFileInfo (..) могут не использовать непосредственно в таком расширении пространства имен оболочки. Работает только CopyHere(..). мне нужно было много времени, чтобы выяснить, как перечислить файлы на цифровик, а теперь и на Android устройства с программой vb.net и скопировать фотографии на ПК с Windows:

Public Const MyComputer As Integer = &H11& 

Sub EnumMyComputer() 
    Dim oItem As Object 
    Dim res As Integer 

    For Each oItem In DirectCast(CreateObject("Shell.Application").Namespace(MyComputer).Items, System.Collections.IEnumerable) 
    Debug.Print(oItem.Type.ToString) 
    if oItem.Type.ToString="Tragbares Medienwiedergabegerät" then '<- check, adopt! 
     res = EnumNamespaceItems(oItem, "", oItem.Name.ToString, 0) 
    End If 
    Next oItem 
End Sub 

Function EnumNamespaceItems(oItem As Object, SrcCPath As String, SrcDPath As String, folderLevel As Integer) As Integer 
    Dim y As Object 
    Dim tempFullFileName As String 

    Debug.Print(StrDup(folderLevel, " ") & "\" & oItem.Name.ToString & " (" & oItem.Path.ToString & ")") 
    For Each y In DirectCast(oItem.GetFolder.items, System.Collections.IEnumerable) 
    'Debug.Print(StrDup(folderLevel, " ") & SrcDPath & y.Name.ToString) 
    If y.IsFolder = True Then 
     Dim n1 As Integer 
     n1 = EnumNamespaceItems(y, SrcCPath & y.Path.ToString & "\", SrcDPath & y.Name.ToString & "\", 1 + folderLevel) 
     If n1 < 0 Then 'failure: Cancel 
     EnumNamespaceItems = n1 
     Exit Function 
     End If 
    Else 'it's a file: 
     Debug.Print(StrDup(folderLevel, " ") & " " & y.Name.ToString) 
     tempFullFileName = System.IO.Path.GetTempPath() & y.Name.ToString 
     ' CopyFile is not possible here if SrcCPath is like "::{…}…": 
     ' My.Computer.FileSystem.CopyFile(SrcCPath & y.Name.ToString , fFile.FullName) 
     Dim suc As Integer = CopyHereFileWait(y, My.Computer.FileSystem.SpecialDirectories.Temp) 
     If suc >= 0 Then 'now we can do things like this: 
     Dim MyFileInfo As System.IO.FileInfo = My.Computer.FileSystem.GetFileInfo(tempFullFileName) 
     Dim fileDate As Date = MyFileInfo.LastWriteTime 
     End If 'suc 
    End If 'else y.IsFolder 
    Next y 
    EnumNamespaceItems = 0 
End Function 


Function CopyHereFileWait(sourceNamespaceObject As Object, targetFolder As String) As Integer 
    Dim fsMyStream As System.IO.FileStream 
    Dim n1 As Integer 
    Dim taregetFullFileName As String 

    n1 = Len(targetFolder) 
    If Mid(targetFolder, n1, 1) = "\" Then 
    targetFolder = Microsoft.VisualBasic.Left(targetFolder, n1 - 1) 
    End If 
    taregetFullFileName = targetFolder & "\" & sourceNamespaceObject.Name.ToString 
    Dim oNsTargetFolder As Object 
    oNsTargetFolder = CreateObject("Shell.Application").Namespace(CStr(targetFolder)) 
    oNsTargetFolder.copyHere(sourceNamespaceObject) 
    'returns immediately and is doing the work in the background 
    n1 = 0 
    Do 
    Threading.Thread.Sleep(50) 'ms 
    Try 
     fsMyStream = System.IO.File.Open(taregetFullFileName, IO.FileMode.Open, IO.FileAccess.ReadWrite) 
     fsMyStream.Close() 
     CopyHereFileWait = n1 
     Exit Function 
    Catch ex As Exception 
     Debug.Print(ex.Message) 
    End Try 
    n1 = n1 + 1 
    Loop While n1 < 400 'timeout 400*50ms = 20s 
    CopyHereFileWait = -n1 
End Function 

Вы можете добавить к проверьте папки с y.Name.ToString = "DCIM" (в папкеLevel = 1) и для файлов с ".jpg".

 Смежные вопросы

  • Нет связанных вопросов^_^