Android'de bulunan dosyayı pc'ye aktarma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
datamole
Üye
Mesajlar: 14
Kayıt: 01 Eki 2014 01:45

Android'de bulunan dosyayı pc'ye aktarma

Mesaj gönderen datamole »

Merhabalar başlığı nasıl yazacağımı bilemedim o sebepten ötürü kusura bakmayın.Yine ufak bir projem var amacım masaüstünde bulunan programı kullanarak telefondaki dosyalarımı masaüstünde belirttiğim klasöre almak bir bakıma telefon dosyası yedekleyicisi fakat telefonun yolunu bir türlü bulamadım buna benzer örnekler sitede usb üzerinden anlatılmış fakat başarılı olamadım dosya aktarmada kullandığım kod;

procedure TForm1.CopyFiles(const FromFolder, ToFolder: string);
var Fo : TSHFileOpStruct; buffer : array[0..4096] of char; p : pchar;
a :integer;
begin
FillChar(Buffer, sizeof(Buffer), #0);
p := @buffer;
StrECopy(p, PChar(FromFolder));
FillChar(Fo, sizeof(Fo), #0);
Fo.Wnd := Application.Handle;
Fo.wFunc := FO_COPY;
Fo.pFrom := @Buffer;
Fo.pTo := PChar(ToFolder);
Fo.fFlags := 0;
a:=SHFileOperation(Fo);
if ((a <> 0)or (Fo.fAnyOperationsAborted <> false)) then
ShowMessage(Başarısız+inttostr(a))
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
CopyFiles('telefon:\Removable\MicroSD\DENE\','D:\Deneme');
end;

aldığım hata ise program telefonun yolunu bulamıyor
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Android'de bulunan dosyayı pc'ye aktarma

Mesaj gönderen G.Arkas »

Önce aşağıdaki function ile usb cihazlarını tespit et. Sonra da içerisinden senin telefon adını arat.

Kod: Tümünü seç

{$MINENUMSIZE 4}
const
  IOCTL_STORAGE_QUERY_PROPERTY =  $002D1400;

type
  STORAGE_QUERY_TYPE = (PropertyStandardQuery = 0, PropertyExistsQuery, PropertyMaskQuery, PropertyQueryMaxDefined);
  TStorageQueryType = STORAGE_QUERY_TYPE;

  STORAGE_PROPERTY_ID = (StorageDeviceProperty = 0, StorageAdapterProperty);
  TStoragePropertyID = STORAGE_PROPERTY_ID;

  STORAGE_PROPERTY_QUERY = packed record
    PropertyId: STORAGE_PROPERTY_ID;
    QueryType: STORAGE_QUERY_TYPE;
    AdditionalParameters: array [0..9] of AnsiChar;
  end;
  TStoragePropertyQuery = STORAGE_PROPERTY_QUERY;

  STORAGE_BUS_TYPE = (BusTypeUnknown = 0, BusTypeScsi, BusTypeAtapi, BusTypeAta, BusType1394, BusTypeSsa, BusTypeFibre,
    BusTypeUsb, BusTypeRAID, BusTypeiScsi, BusTypeSas, BusTypeSata, BusTypeMaxReserved = $7F);
  TStorageBusType = STORAGE_BUS_TYPE;

  STORAGE_DEVICE_DESCRIPTOR = packed record
    Version: DWORD;
    Size: DWORD;
    DeviceType: Byte;
    DeviceTypeModifier: Byte;
    RemovableMedia: Boolean;
    CommandQueueing: Boolean;
    VendorIdOffset: DWORD;
    ProductIdOffset: DWORD;
    ProductRevisionOffset: DWORD;
    SerialNumberOffset: DWORD;
    BusType: STORAGE_BUS_TYPE;
    RawPropertiesLength: DWORD;
    RawDeviceProperties: array [0..0] of AnsiChar;
  end;
  TStorageDeviceDescriptor = STORAGE_DEVICE_DESCRIPTOR;

function GetBusType(Drive: AnsiChar): TStorageBusType;
var
  H: THandle;
  Query: TStoragePropertyQuery;
  dwBytesReturned: DWORD;
  Buffer: array [0..1023] of Byte;
  sdd: TStorageDeviceDescriptor absolute Buffer;
  OldMode: UINT;
begin
  Result := BusTypeUnknown;

  OldMode := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    H := CreateFile(PChar(Format('\\.\%s:', [AnsiLowerCase(Drive)])), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
      OPEN_EXISTING, 0, 0);
    if H <> INVALID_HANDLE_VALUE then
    begin
      try
        dwBytesReturned := 0;
        FillChar(Query, SizeOf(Query), 0);
        FillChar(Buffer, SizeOf(Buffer), 0);
        sdd.Size := SizeOf(Buffer);
        Query.PropertyId := StorageDeviceProperty;
        Query.QueryType := PropertyStandardQuery;
        if DeviceIoControl(H, IOCTL_STORAGE_QUERY_PROPERTY, @Query, SizeOf(Query), @Buffer, SizeOf(Buffer), dwBytesReturned, nil) then
          Result := sdd.BusType;
      finally
        CloseHandle(H);
      end;
    end;
  finally
    SetErrorMode(OldMode);
  end;
end;


procedure GetUsbDrives(List: TStrings);
var
  DriveBits: set of 0..25;
  I: Integer;
  Drive: AnsiChar;
begin
  List.BeginUpdate;
  try
    Cardinal(DriveBits) := GetLogicalDrives;

    for I := 0 to 25 do
      if I in DriveBits then
      begin
        Drive := Chr(Ord('a') + I);
        if GetBusType(Drive) = BusTypeUsb then
          List.Add(Drive);
      end;
  finally
    List.EndUpdate;
  end;
end;
Resim
datamole
Üye
Mesajlar: 14
Kayıt: 01 Eki 2014 01:45

Re: Android'de bulunan dosyayı pc'ye aktarma

Mesaj gönderen datamole »

hocam tam anlayamadım link veya .zip var mı acaba elinizde
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Android'de bulunan dosyayı pc'ye aktarma

Mesaj gönderen G.Arkas »

Yukarıda gönderdiğim kod ile

Kod: Tümünü seç

procedure GetUsbDrives(List: TStrings);
bu procedure sana bilgisayarında bağlı olan removable cihaz listesini verecek. Buradan cihazın sürücü adını bulabilirsin. Sonra gerisi path vermek zaten. örnek olarak;

Kod: Tümünü seç

H:\DENE\TEST;// H harfi senin cihazının sürücü harfi. Dosya içeriğini görmek için tam yolu sen belirtebilirsin.
Resim
Cevapla