• User Newbie

    Gestione file pdf , spostamento e rinomina.

    Buongiorno e grazie anticipate a chi mi potrà aiutare
    Il mio problema è questo:
    ho creato una cartella sul mio sito web "/dipendenti" dove carico tramite ftp un centinaio di file pdf che si differiscono tra loro solo per il numero finale es: Eco_000000002.pdf, Eco_000000003.pdf, Eco_000000012.pdf etc.etc.
    Vorrei spostare questi file in modo automatico ed associarli ad altre cartelle create es:
    Eco_000000002.pdf che si trova appunto in "/dipendenti" spostarla nella cartella "/ml.pluto"
    Eco_000000012.pdf che si trova appunto in "/dipendenti" spostarla nella cartella "/gs.pippo" e così via..
    ed altresì una volta spostati farli rinominare automaticamente con un nome a piacimento, es:
    Eco_000000002.pdf in , Cedolino_luglio_2015.
    Il tutto credo si possa realizzare con un web script o qualcos'altro.
    Quindi chiedo aiuto a qualche anima pia che mi butti giù uno script.
    ps. Ho provato a crearlo io con l'aiuto di qualche amico,...ma niente da fare, non mi da errore ma non funziona.*

    Ecco lo script:

    <?php**
    $dipendente['ml.comeo']="000000002";**
    $dipendente['gs.telfino']="000000016";**
    //leggiifilechehaicaricatoindipendenti**
    $cedolini=array_map("basename",glob("../dipendenti/
    .pdf"));
    $data=date("Y-m");//leggil'annoeladataequidate**
    foreach($dipendente
    as*$nome*=>$codice){//cicliidipendenti**
    foreach($cedolinias$cedolino){//cicliicedolini**
    *******$pos=strpos($cedolino,$codice);//verifichi
    chenelcedolinocisiailcodicedeldipendente*
    *****if($pos>0){//trovatacorrispondenza
    **********$vecchio_nome_cedolino="../dipendenti/".$cedolino;
    ********$nuovo_nome_cedolino="../".$nome."/".$nome."".$data."".$codice.".pdf";//econlacartella
    *********if(rename($vecchio_nome_cedolino,$nuovo_nome_cedolino)){
    ***********echo"spostato$vecchio_nome_cedolinoin$nuovo_nome_cedolino<br>";
    ***********}
    }
    }

    ?>

    SCUSATEMI quando ho incollato il codice si sono creati gli asterischi.


  • User Attivo

    Per risolvere il problema si possono percorrere più alternative, tuttavia cercherò di riprendere il codice del richiedente e svilupparlo per mettere in luce alcune critiche.

    Per prima cosa ho definito un array $nuovi_nomi che contenga l'elenco dei nuovi nomi dei file. La posizione degli elementi di questa struttura di dati deve corrisponde a quella di $cedolini, conseguentemente verificherei con estrema attenzione se la funzione glob() riportasse sempre esattamente la stessa sequenza oppure se cambiasse, in tal caso converrà scriverla a mano.

    Mi sembra che ci sia un errore in questa riga:
    [PHP]$nuovo_nome_cedolino="../".$nome."/".$nome."".$data."".$codice.".pdf";//e con la cartella[/PHP]
    poiché compare due volte la variabile $nome che quindi creerà una struttura ridondantemente nidificata. Inoltre valuterei l'esclusione della variabile $data poiché per com'è definita verrà istanziata all'anno ed al mese di quando verrà eseguito lo script. Infine la variabile $codice è presa dal valore dell'istruzione foreach ($dipendente as $nome => $codice) che come si noterà non ha alcuna relazione con il nuovo nome del file.
    Una possibile riscrittura potrebbe essere:
    [PHP]$nuovo_nome_cedolino = "../".$nome."".$data."".$nuovi_nomi*.".pdf";//e con la cartella[/PHP]

    In base alle precedenti osservazioni il codice completo è il seguente:

    [PHP]<?php

    $dipendente['ml.comeo'] = "000000002";
    $dipendente['gs.telfino'] = "000000016";
    $nuovi_nomi = array('Cedolino_luglio_2015', 'NuovoNomeFile'); // Elenco dei nuovi nomi, deve esseci corrispondenza con quelli degli indici dei cedolini
    $cedolini = array('Eco_000000002.pdf', 'Eco_000000016.pdf'); // Sostituire con $cedolini=array_map("basename",glob("../dipendenti/.pdf")); // Attenzione: verificare che sia verificata la corrispondenza con l'array $nuovi_nomi posizione per posizione, altrimenti conviene scriverli a mano per non rischiare.
    $data=date("Y-m"); //leggi l'anno e la data e qui date
    foreach ($dipendente as $nome => $codice)
    foreach ($cedolini as $i => $cedolino)
    if (strpos($cedolino, $codice) > 0) {
    $vecchio_nome_cedolino = "../dipendenti/".$cedolino;
    $nuovo_nome_cedolino = "../".$nome."".$data."".$nuovi_nomi
    .".pdf";//e con la cartella
    if(rename($vecchio_nome_cedolino,$nuovo_nome_cedolino)) {
    echo "spostato $vecchio_nome_cedolino in $nuovo_nome_cedolino<br>";
    }
    }

    ?>[/PHP]

    Non escludo che il codice potrebbe essere molto più sintetico ricorrendo ad altre impostazioni del problema.

    Sfortunatamente non ho molto tempo per dare una risposta completa, e non garantisco il corretto funzionamento del codice poiché non mi è stato possibile testarlo, quindi consiglio di fare molte prove prima di eseguirlo.

    Nota: nell'anteprima del messaggio noto che nella versione pubblicata potrebbe esserci una linea spezzata malamente che inizia per: "*.pdf")); // Attenzione: verificare che sia verificata la corrispondenza con l'array..." ricongiungerla con la precedente.

    Suggerisco caldamente di ricorrere all'editor avanzato per mettere il codice negli appositi marcatori dello specifico linguaggio per permetterci di capirlo un po' meglio oltre ad essere prescritto nel regolamento di sezione. Grazie per la collaborazione.[/OT]


  • User Newbie

    @MenteLibera said:

    Per risolvere il problema si possono percorrere più alternative, tuttavia cercherò di riprendere il codice del richiedente e svilupparlo per mettere in luce alcune critiche.

    Per prima cosa ho definito un array $nuovi_nomi che contenga l'elenco dei nuovi nomi dei file. La posizione degli elementi di questa struttura di dati deve corrisponde a quella di $cedolini, conseguentemente verificherei con estrema attenzione se la funzione glob() riportasse sempre esattamente la stessa sequenza oppure se cambiasse, in tal caso converrà scriverla a mano.

    Mi sembra che ci sia un errore in questa riga:
    [PHP]$nuovo_nome_cedolino="../".$nome."/".$nome."".$data."".$codice.".pdf";//e con la cartella[/PHP]
    poiché compare due volte la variabile $nome che quindi creerà una struttura ridondantemente nidificata. Inoltre valuterei l'esclusione della variabile $data poiché per com'è definita verrà istanziata all'anno ed al mese di quando verrà eseguito lo script. Infine la variabile $codice è presa dal valore dell'istruzione foreach ($dipendente as $nome => $codice) che come si noterà non ha alcuna relazione con il nuovo nome del file.
    Una possibile riscrittura potrebbe essere:
    [PHP]$nuovo_nome_cedolino = "../".$nome."".$data."".$nuovi_nomi*.".pdf";//e con la cartella[/PHP]

    In base alle precedenti osservazioni il codice completo è il seguente:

    [PHP]<?php

    $dipendente['ml.comeo'] = "000000002";
    $dipendente['gs.telfino'] = "000000016";
    $nuovi_nomi = array('Cedolino_luglio_2015', 'NuovoNomeFile'); // Elenco dei nuovi nomi, deve esseci corrispondenza con quelli degli indici dei cedolini
    $cedolini = array('Eco_000000002.pdf', 'Eco_000000016.pdf'); // Sostituire con $cedolini=array_map("basename",glob("../dipendenti/.pdf")); // Attenzione: verificare che sia verificata la corrispondenza con l'array $nuovi_nomi posizione per posizione, altrimenti conviene scriverli a mano per non rischiare.
    $data=date("Y-m"); //leggi l'anno e la data e qui date
    foreach ($dipendente as $nome => $codice)
    foreach ($cedolini as $i => $cedolino)
    if (strpos($cedolino, $codice) > 0) {
    $vecchio_nome_cedolino = "../dipendenti/".$cedolino;
    $nuovo_nome_cedolino = "../".$nome."".$data."".$nuovi_nomi
    .".pdf";//e con la cartella
    if(rename($vecchio_nome_cedolino,$nuovo_nome_cedolino)) {
    echo "spostato $vecchio_nome_cedolino in $nuovo_nome_cedolino<br>";
    }
    }

    ?>[/PHP]

    Non escludo che il codice potrebbe essere molto più sintetico ricorrendo ad altre impostazioni del problema.

    Sfortunatamente non ho molto tempo per dare una risposta completa, e non garantisco il corretto funzionamento del codice poiché non mi è stato possibile testarlo, quindi consiglio di fare molte prove prima di eseguirlo.

    Nota: nell'anteprima del messaggio noto che nella versione pubblicata potrebbe esserci una linea spezzata malamente che inizia per: "*.pdf")); // Attenzione: verificare che sia verificata la corrispondenza con l'array..." ricongiungerla con la precedente.

    Suggerisco caldamente di ricorrere all'editor avanzato per mettere il codice negli appositi marcatori dello specifico linguaggio per permetterci di capirlo un po' meglio oltre ad essere prescritto nel regolamento di sezione. Grazie per la collaborazione.[/OT]

    Salve, ho provato il suo script ma non riesco a farlo funzionare... so che è passato un pò di tempo ma è proprio quello che mi occorre... ha per caso fatto ulteriori verifiche? Grazie mille


  • User Attivo

    @lory22 said:

    ha per caso fatto ulteriori verifiche? Grazie mille

    Ni. Escludendo le funzioni per riportare l’elenco dei file (glob) e quella per lo spostamento (rename) ho provato ad eseguire il codice che avevo postato e funziona purché siano soddisfatte le avvertenze contenute nel post e nei commenti al codice grazie ad un tester online che per motivi di sicurezza le ha disabilitate.

    Il codice scritto se poteva essere un punto di arrivo per l’OP esso potrebbe richiedere delle modifiche per riportarlo al proprio caso. Consiglio di fare molto debug del codice per comprendere pienamente ciò che fa.

    Buon lavoro!