Sincronizziazione immagini da PPC a PC
Mi capita spesso di scattare fotografie con il mio fido PPC (i-mate K-Jam, alias Qtek 9100, alias HTC Wizard). Quello che però manca totalmente in questo bell'oggetto è la possibilità di scaricare le foto nel PC con una procedura automatizzata, come, per esempio, quelle a corredo di molte macchine fotografiche digitali.
Così mi sono deciso a crearmene una per conto mio, che permetta di copiare nel PC i files jpg dal palmare, nella stessa struttura delle cartelle utilizzata dal programma di sincronizzazione della mia fida Canon Ixus 430 (ogni foto viene salvata in una cartella con nome nel formato aaaa_mm_gg).
Alla prima impressione basterebbero poche righe di codice, scritto in VB.NET o in C#, usando la classe System.IO per accedere ai files nella cartella nel PPC in cui sono salvate le foto per poi copiarle/spostarle nella cartella desiderata del PC, ma purtroppo non è così semplice...
L'accesso alle cartelle del PPC dal PC è permesso solo tramite ActiveSync, in poche parole non è possibile un semplice "Copy *.jpg "\Scheda di memoria\My Documents\Immagini" C:\Immagini".
A questo punto vi sono 3 strade intraprendibili:
- Cercare un software di terze parti che permetta questa funzionalità (se ne trovano diversi in rete)
- Creare un piccolo server FTP nel PPC per permettere l'accesso a determinate cartelle dal PC
- Utilizzare le Remote API (RAPI) per accedere direttmente ai files nel PPC
Pur essendo ben documentata e esemplifacata da Microsoft (How to copy files to a Windows CE-based device by using RAPI from Visual Basic), ho preferito sfruttare un assembly esterno (l'oggetto RAPI contenuto in OpenNETCF.Desktop.Communication).
A questo punto la copia delle fotografie dal palmare nel PC è eseguibile semplicemente:
Function Transfer(ByVal PPCfolder As String, ByVal PCfolder As String, ByVal DeleteImageFromPPC As Boolean) As Integer
Dim fileTotal As Integer = 0
Dim files As ArrayList = New ArrayList
Dim rapi As OpenNETCF.Desktop.Communication.RAPI = New OpenNETCF.Desktop.Communication.RAPI
rapi.Connect()
'Ricavo la lista dei files dal ppc
GetFilesFromPPC(rapi, PPCfolder, files)
Dim fileEnumerator As System.Collections.IEnumerator = files.GetEnumerator()
While fileEnumerator.MoveNext()
'per ogni file...
Dim FileName As String = Convert.ToString(fileEnumerator.Current)
'ricavo il nome senza percorso
Dim FileShortName As String = System.IO.Path.GetFileName(FileName)
'Verifico che il file sia una foto (deve iniziare con 20(anno))
If FileShortName.Substring(0, 2) = "20" Then
fileTotal += 1
Dim Anno As String = FileShortName.Substring(0, 4)
Dim Mese As String = FileShortName.Substring(4, 2)
Dim Giorno As String = FileShortName.Substring(6, 2)
If Not Directory.Exists(PCfolder & "\" & Anno & "_" & Mese & "_" & Giorno) Then
'Se nel pc non esite la cartella necessaria per copiarci la foto la creo
Directory.CreateDirectory(PCfolder & "\" & Anno & "_" & Mese & "_" & Giorno)
End If
If Not File.Exists(PCfolder & "\" & Anno & "_" & Mese & "_" & Giorno & "\" & FileShortName) Then
Try
rapi.CopyFileFromDevice(PCfolder & "\" & Anno & "_" & Mese & "_" & Giorno & "\" & FileShortName, FileName)
If DeleteImageFromPPC Then
rapi.DeleteDeviceFile(FileName)
End If
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
End If
End If
End While
rapi.Disconnect()
Return fileTotal
End Function
Private Sub GetFilesFromPPC(ByVal rapi As OpenNETCF.Desktop.Communication.RAPI, ByVal PPCPath As String, ByRef Files As ArrayList)
Dim filelist As OpenNETCF.Desktop.Communication.FileList = rapi.EnumFiles(PPCPath & "\*")
For Each file As OpenNETCF.Desktop.Communication.FileInformation In filelist
If file.FileAttributes = 16 Then
'Si tratta di una directory, rieseguo la funzione ricorsivamente
GetFilesFromPPC(rapi, PPCPath & "\" & file.FileName, Files)
Else
'Si tratta di un file
Files.Add(PPCPath & "\" & file.FileName)
End If
Next
End Sub
0 commenti:
Posta un commento