+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: funzione che copia file da una cartella ad un'altra

  1. #1
    caviccun non è in linea Scolaretto
    Luogo
    GENOVA
    Post
    104

    funzione che copia file da una cartella ad un'altra

    Salve a tutti.Mi interessa una funzione che mi copi da una cartella di un disco, file e sottocartelle, ad un’altra cartella di un altro disco o lo stesso disco.Esempio.Poniamo che in C ho la cartella pippo (C:\pippo) ed in I la cartella pluto (I:\pluto).Io vorrei copiare da C pippo, i file e le sottocartelle, in I pluto. Ho già una funzione che fa questo ma in un modo diverso da quello che voglio ottenere io.Infatti la funzione che ho, copia i file e le sottocartelle di C:\pippo a I:\pluto, però in I:\pluto vi copia anche la cartella pippo, cioè in I:\pluto copia in questo modo: I:\pluto\pippo.Invece a me interessa che in I:\pluto ci vadano SOLO i file e le sotto cartelle di C:\pippo.
    La funzione è la seguente (dichiarando la: uses shellApi).Secondo i più esperti di me, è possibile modificarla,magari non booleana, che faccia quello che a me interessa, oppure ne andrebbe riscritta una nuova per ottenere quello che voglio?Grazie.
    codice:
    Function CopyDir(const fromDir, toDir: string): Boolean;
    var
    fos: TSHFileOpStruct;
    begin
    ZeroMemory(@fos, SizeOf(fos));
    with fos do
    begin
    wFunc := FO_COPY;
    fFlags := FOF_FILESONLY;
    pFrom := PChar(fromDir + #0);
    pTo := PChar(toDir);
     end;
    Result := (0 = ShFileOperation(fos));
    end;
    Ultima modifica di AntonioG; 28-03-2019 18:21  Motivo: Usa il tag CODE non QUOTE!
    Ad una persona cattiva gli puoi versare sopra tutto il Rum che vuoi, non diventerà mai buona come un Babà

  2. #2
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Luogo
    Reggio Emilia
    Post
    1,143
    La funzione che hai usato è quella corretta, ma il problema centrale è che tu non devi chiedere alla funzione di copiare una directory in un'altra (es. Pippo in Pluto), ma solo le sottodirectory e i file della directory di partenza.

    Non avrai quindi un percorso unico coincidente con la directory di partenza, ma più percorsi di tutte le cartelle e i file che si trovano al suo interno e che vanno copiati.

    Trovi un esempio del passaggio di percorsi multipli in questa pagina, usando la funzione StrECopy.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Homepage | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  3. #3
    caviccun non è in linea Scolaretto
    Luogo
    GENOVA
    Post
    104
    Mi devi scusare se non ho capito e la colpa è solo mia che non conosco bene le Api. Nella funzioneche mi hai indicato, che ho provato e che mi da un errore (ovviamente usando la shellApi), mi pare copi solo singoli file con questi comandi
    codice:
    p := StrECopy(p, ‘C:FirstFile.ext1’) + 1;
     p := StrECopy(p, ‘C:SecondFile.ext2’) + 1;
    invece a me interessa tutto il contenuto di una catella come la seguente procedura che funziona benissimo e che uso, che però non mi copia anche le sottocartelle:
    codice:
    procedure CpyFl(const FileName, DestName: TFileName);
    var
      CopyBuffer: Pointer;
      TimeStamp, BytesCopied: Longint;
      Source, Dest: Integer;
      Destination: TFileName;
    const
      ChunkSize: Longint = 8192;
    begin
      Destination := ExpandFileName(DestName);
      TimeStamp := FileAge(FileName);
      GetMem(CopyBuffer, ChunkSize);
      try
        Source := FileOpen(FileName, fmShareDenyWrite);
        try
          Dest := FileCreate(Destination);
          try
            repeat
              BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize);
              if BytesCopied > 0 then
                FileWrite(Dest, CopyBuffer^, BytesCopied);
            until BytesCopied < ChunkSize;
          finally
            FileClose(Dest);
          end;
        finally
          FileClose(Source);
        end;
      finally
        FreeMem(CopyBuffer, ChunkSize);
      end;
    end;
    Se trovo il modo di usare una funzione o procedura come questa che però mi copi anche le sottocartelle, ho risolto.
    Ultima modifica di AntonioG; 29-03-2019 07:03  Motivo: Usa i tag CODE non QUOTE! Ultimo avviso
    Ad una persona cattiva gli puoi versare sopra tutto il Rum che vuoi, non diventerà mai buona come un Babà

  4. #4
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,216
    Blogs
    5
    @caviccun ... devi usare i tag CODE per il codice e non devi fare il QUOTE. Più volte ho corretto io e te l'ho fatto notare ma sembra che tu non lo abbia notato. Anche questa volta correggo ma fai attenzione.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  5. #5
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Luogo
    Reggio Emilia
    Post
    1,143
    Quote Originariamente inviato da caviccun
    mi pare copi solo singoli file con questi comandi
    codice:
    p := StrECopy(p, ‘C:FirstFile.ext1’) + 1;
     p := StrECopy(p, ‘C:SecondFile.ext2’) + 1;
    Quei comandi servono a costruire l'elenco dei percorsi delle cartelle e dei file che devono essere copiati nella destinazione.

    Quote Originariamente inviato da caviccun
    invece a me interessa tutto il contenuto di una catella
    Anche questa esigenza è più che chiara.

    Il problema è che non c'è una modalità per dire alla funzione di eseguire direttamente quello che vuoi: devi essere tu a usare le funzioni FindFirst/FindNext/FindClose, o in alternativa le classi della unit IOUtils, per ottenere l'elenco delle cartelle e dei file che si trovano nella cartella di origine.

    Una volta che hai quell'elenco, costruisci con l'appoggio di StrECopy la sequenza dei percorsi da copiare e infine invochi la funzione della shell di copia dei file.

    In breve, ciò che vuoi ottenere non è raggiungibile con un solo passaggio: prima devi recuperare cartelle e file della directory di origine, costruire l'elenco dei percorsi nel formato compatibile con la funzione della shell e infine invocare la funzione passando questo elenco e indicando la cartella di destinazione come output.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Homepage | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  6. #6
    caviccun non è in linea Scolaretto
    Luogo
    GENOVA
    Post
    104
    Capito, allora per le mie conoscenze di delphi quello che mi stai dicendo è un pò complicato:Infatti ho fatto delle prove, sia prima di chiedere consigli ed ora con i tuoi, ma non ho risolto una cippa.Forse sono poche righe di codice però non trovo soluzione.Se ti va mi dai due dritte di codice, se non ti va capsco benisimo, amici come prima, ciao e grazie.
    Ad una persona cattiva gli puoi versare sopra tutto il Rum che vuoi, non diventerà mai buona come un Babà

  7. #7
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Luogo
    Reggio Emilia
    Post
    1,143
    Quote Originariamente inviato da caviccun Visualizza il messaggio
    Capito, allora per le mie conoscenze di delphi quello che mi stai dicendo è un pò complicato:Infatti ho fatto delle prove, sia prima di chiedere consigli ed ora con i tuoi, ma non ho risolto una cippa.Forse sono poche righe di codice però non trovo soluzione.Se ti va mi dai due dritte di codice, se non ti va capsco benisimo, amici come prima, ciao e grazie.
    Purtroppo al momento non ho il tempo di scrivere il codice esatto.

    Ad ogni modo, piuttosto che fare delle prove, fossi in te andrei per gradi, ossia eviterei di scrivere una marea di codice ritoccandolo fino a quando non fa tutto, ma procederei per passi successivi scomponendo il problema e "aggredendolo" un pezzo alla volta.

    Ad esempio, puoi prendere in carico questi passaggi in modo del tutto separato:

    1) acquisire il nome della directory di input;
    2) ottenere l'elenco dei file e delle directory di primo livello;
    3) convertire l'elenco dei percorsi nel formato per la funzione shell;
    4) acquisire il nome della directory di output;
    5) chiamare la funzione passando i parametri determinati nei punti precedenti;
    6) assemblare i passaggi in una funzione più grande o incapsularli in un oggetto.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Homepage | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  8. #8
    caviccun non è in linea Scolaretto
    Luogo
    GENOVA
    Post
    104
    Caro amico hai ragione però una cosa ho capito, ed è che per scrivere il codice per ottenere quello che a me interessa è utile conoscere le Api, ma per mettere in pratica quello che hai letto devi fare molte prove prima.Poi c'è da considerare un'altra cosa, ci sono manuali che parlano di Api, a cosa servono, come si dovrebbero usare? Quindi il problema non sta solo nell'apprendimento di dephi ma di tutto il corollario che vi gira intorno.Tu dirai che, o questo oppure è inutile che uno voglia programmare.Beh io penso, sicuramente sbaglio, che certi problemi vengano risolti in team, da soli la cosa diventa diffcilina.Più cervelli che studiano un problema da risolvere sono meglio di uno solo.La programmazione mi affascina perchè il software prescinde su qualunque struttura, in special modo sulla robotica, però al di là del fascino, sono soltanto un programmatore hobbista che ha iniziato ad interessarsi di un mondo sconosciuto e di linguaggi, a 50 anni, ignorando completamente cos'era una variabile, perchè si usano,a cosa servissero, che funzione avessero, cioè portarti ad un modo nuovo di ragionare.Comunque ti ringrazio perchè apprezzo la tua volontà di aiutare.saluti.
    Ad una persona cattiva gli puoi versare sopra tutto il Rum che vuoi, non diventerà mai buona come un Babà

  9. #9
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Luogo
    Reggio Emilia
    Post
    1,143
    Quote Originariamente inviato da caviccun Visualizza il messaggio
    Caro amico hai ragione però una cosa ho capito, ed è che per scrivere il codice per ottenere quello che a me interessa è utile conoscere le Api, ma per mettere in pratica quello che hai letto devi fare molte prove prima.Poi c'è da considerare un'altra cosa, ci sono manuali che parlano di Api, a cosa servono, come si dovrebbero usare? Quindi il problema non sta solo nell'apprendimento di dephi ma di tutto il corollario che vi gira intorno.Tu dirai che, o questo oppure è inutile che uno voglia programmare.Beh io penso, sicuramente sbaglio, che certi problemi vengano risolti in team, da soli la cosa diventa diffcilina.Più cervelli che studiano un problema da risolvere sono meglio di uno solo.La programmazione mi affascina perchè il software prescinde su qualunque struttura, in special modo sulla robotica, però al di là del fascino, sono soltanto un programmatore hobbista che ha iniziato ad interessarsi di un mondo sconosciuto e di linguaggi, a 50 anni, ignorando completamente cos'era una variabile, perchè si usano,a cosa servissero, che funzione avessero, cioè portarti ad un modo nuovo di ragionare.Comunque ti ringrazio perchè apprezzo la tua volontà di aiutare.saluti.
    Onestamente non capisco l'essenza del tuo discorso, poiché dici di essere affascinato dalla programmazione, quindi presumo che la tua attuale attività di scrittura del codice sia guidata anche da una certa dose di necessaria passione, ma al primo problema in più che si incontra - rispetto a quello che riesci a risolvere con la "pappa pronta" - la discussione tecnica si arresta e ci si sposta su discorsi filosofici.

    Nei discorsi tra l'altro si parla di cose un po' astratte: corollari, manuali, "molte prove da fare", il punto di partenza e il traguardo che hai raggiunto, senza però giungere invece a qualcosa di concreto, ossia il tentativo fatto di risolvere anche solo uno dei più piccoli step che ti ho proposto per semplificare.

    E' chiaro che per giungere a un obiettivo bisogna mettersi d'impegno, cercare di capire il funzionamento degli strumenti aiutandosi con la documentazione online (che ho linkato più volte citando le possibili funzioni a cui puoi fare ricorso) e fare lo sforzo per ottenere quello che si vuole.

    Sono perfettamente d'accordo che la risoluzione dei problemi in team sia la più efficace, ma quella che proponi tu nel tuo discorso è leggermente diversa: la tua squadra ideale è composta da te che esponi il problema o il risultato da raggiungere, e gli altri a piacere che lavorano alla soluzione e te la propongono servita.

    Sono contento che tu apprezzi la mia volontà di aiutare, anche perché al momento non potrei offrire altro: capisco le tue difficoltà, ma questo è anche il mio mestiere e non posso mettermi a studiare problemi e scrivere codice pronto per tutti coloro che me lo chiedono.

    Se la richiesta è per passione, non la capisco perché questa dovrebbe spronare a trovarla o almeno impegnarsi a cercarla.
    Se la richiesta è per sviluppare un software per motivi lavorativi, non si ha sempre il tempo (parlando per me) di scriverlo conto terzi gratuitamente.

    Scusa se scrivo queste cose, perché non voglio sindacare sulle intenzioni di nessuno, ma siccome hai tirato fuori tu più volte la questione (come nell'ultimo messaggio) senza però avanzare costruttivamente verso qualcosa che possa dare indizi alla risoluzione del problema, dovevo dire la mia.

    Per proseguire, io direi di tornare nell'ambito tecnico e parlare solo del problema, e non delle ambizioni personali e pareri sul "pair programming": magari concentrati sui suggerimenti, prova a compiere piccoli passi e se serve aiuto o informazioni aggiuntive, esponile qui e saremo felici di aiutarti, tempo libero e volontà permettendo.

    Un saluto!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Homepage | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  10. #10
    caviccun non è in linea Scolaretto
    Luogo
    GENOVA
    Post
    104
    E' difficile (penso) essere credibili quando nascono appunti personali, perchè non ci si conosce fisicamente,però lo devo dire ugualmente.Se chiedessi aiuto per un software a pagamento mi sentirei un infame, ed io nella mia vita non lo sono mai stato, ma come dicevo prima, non conoscendo gli utenti del forum, concordo con il tuo lecitissimo dubbio.Per quanto riguarda la "pappa fatta", credimi se ti dico senza ipocrsia che hai ragione, però secondo me tralasci un aspetto, ed è quello dell'imparare copiando.Infatti quando iniziai ad interessarmi di programmazione, per capire copiavo codici di altri, mi riferisco al vecchio basic DOS, che fu propedeutico per capire altre cose.Secondo me è proprio copiando che s'impara. Il software è per una mia amica che non sa copiare dal disco C ad una chiavetta usb, e viceversa.Nella cartellla di provenienza non ci sono sottocartelle da copiare però ho pensato che già che c'ero potevo scrivere un codice che copiasse anche le sottocartelle anche se non ce ne fossero, così sarebbe stato più completo.Attualmente nel codice del programma c'è la procedura CpyFl che funziona.Ho fatto una prova con un comando DOS, poco elegante ma funziona benissimo, nelle prove ho copiato da una cartella ad un'altra dove c'erano anche sottocartelle oltre a dei file.Il comando è tutto in una riga.
    codice:
    WinExec (PAnsiChar (AnsiString ('robocopy '+cartella_DA + ' '+Catella_A+' /e')),0);
    gli spazi non sono per caso
    fa un pò schifo , è come mettere un goto,però è stata solo una prova.Ovviamente funziona solo se un SO è basato sul DOS.Ok, tanti Saluti.
    Ultima modifica di AntonioG; 29-03-2019 20:48  Motivo: Tag CODE mancanti. Dal prossimo si chiude.
    Ad una persona cattiva gli puoi versare sopra tutto il Rum che vuoi, non diventerà mai buona come un Babà

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi