Newsgroup: it.comp.www.php
Titolo: Dubbio su unlink

Ciao a tutti,
ho risolto il problema relativo alla lettura dei file in una cartella grazie 
al vostro contributo. Ho solo un dubbio.
Ipotizzando che lo script stia leggendo tutti i file della cartella, se 
durante la lettura di questi file contenuti all'interno della cartella 
dovessi eliminarne qualcuno di quelli che ancora non ha letto con 
unlink($nomefile), quando lo script arriverà a leggere quel nome... lo 
leggerà correttamente? oppure darà errore?
Mi aspetto che dia errore in quanto il file non esiste più fisicamente nella 
cartella, eppure tutte le operazioni (file_exists, is_readable etc) danno 
esito positivo, proprio come se il file (eliminato) continuasse a esistere.
Il che non mi convince molto, cosa c'è che non va? E' normale  ciò?
Grazie in anticipo a chi mi risponde.
Cooper.
--
www.blueware.it
 

 se il file (eliminato) continuasse a esistere.
Eliminato come? Queste semplici righe:
<?php
$filename = 'delete.txt'; // Il file esiste.
unlink($filename);
if (file_exists($filename)) {
  echo $filename.' esiste';
} else {
  echo $filename.' non esiste piů';
}
?>
restituiscono correttamente "delete.txt non esiste piů".
Ciao.
-- 
Federico


No, provo a spiegarmi meglio.
Poniamo la cartella MIACARTELLA. In questa cartella ho tre file: FILE1.PHP, 
FILE2.PHP, FILE3.PHP.
Con le righe:
      $dir = opendir($source);
      while ($file = readdir($dir)) { $file_array[] = $file; }
Carico i nomi dei file nell'array $file_array, e quindi con le righe:
          foreach ($file_array as $file) {
            if ( $file == ".." || $file == ".") { continue; } else {
                 // CODICE A
              }
           }
leggo tutti i nomi dei file precedentemente caricati (con esclusione di . e 
..)uno alla volta, ovvero:
FILE1.PHP
FILE2.PHP
FILE3.PHP
Ora se all'interno di CODICE A pongo una riga che elimina FILE3.PHP quando 
ancora non è arrivato a leggerlo (supponiamo che sia arrivato a FILE1.PHP) 
succede che nel momento in cui va a leggere FILE3.PHP non mi restituisce 
alcun errore, ovvero mi dice che il file è esistente.
La mia domanda era, come è possibile ciò se prima ancora di essere 
processato questo file è stato eliminato?
L'esistenza del file è determinata dal fatto che attraverso l'istruzione: 
is_readable() mi restituisce true, quando invece avrebbe dovuto restituire 
false, ed è questo che non mi convince.
Grazie ancora, rimango in attesa di riscontri.
Cooper.

 Cooper.
[..]
un file eliminato per definizione non continua ad esistere..
ma un file eliminato che continua ad essere letto potrebbe esistere..
fai dei test se possibile e facci sapere.. 
-- 
www.iuz-lab.info

 Cooper.
sicuro che il file sia stato eliminato?
-- 
www.iuz-lab.info

unlink funziona in modo asincrono.
schedula un comando per la cancellazione del file.
... vedi help

 file è esistente.
...
Come lo elimini FILE3.PHP? Come verifichi la sua esistenza?
Il seguente codice:
<?php
$source = '/wwwroot/test/blob/';
$dir = opendir($source);
while ($file = readdir($dir))
{
  if ($file != '..' && $file != '.')
  { 
    // Memorizza il nome dei file nell'array $file_array.
    $file_array[] = $file; 
  }
}
// Riordino l'array in ordine alfabetico
sort($file_array);
reset($file_array);
foreach ($file_array as $file)
{
  // Elimino, se esiste, il file zzz.txt
  if (file_exists($source.'zzz.txt'))
  {
    unlink($source.'zzz.txt');
  }
 
  // Stampo la lista dei file esistenti.
  if (is_readable($source.$file))
  {
    echo $file.'<br />';
  }
}
?>
Non mi stampa a video 'zzz.txt' perché è stato eliminato attraverso
unlink() (naturalmente inizialmente esisteva). Sia Su WinXP sia su
Linux con Apache 1.3.33 e PHP 4.4.2.
Eventualmente riporta il frammento di codice che non si comporta come
aspettato.
-- 
Federico

Se apri il file, quindi chiami unlink(), puoi continuare ad usare il
file; non ne rimane traccia su disco, appena lo chiudi il file e'
definitivamente rimosso.
E' una tecnica comunemente usata per i files temporanei.
In effetti unlink() non cancella il file , rimuove il link , un altro
processo si occupa di rimuovere il file quando si accorge che non ci
sono piu' link ad esso e nessuno lo sta utilizzando.