Strano errore

« Older   Newer »
  Share  
-AsCiA-
CAT_IMG Posted on 1/10/2011, 00:49     +1   -1




Ciao raga,per approfondire un po' i concetti:
-metodi ricorsivi
-I/O in java su file
ho pensato di scrivere un piccolo algoritmo ricorsivo...
L'algoritmo fa esattamente questo:
Parte da una path iniziale e scrive i nomi di tutti i file che trova...
se il file trovato non e' un file ma una directory richiama se stesso inpostando come directory quella appena trovata...
in pratica scrive tutti i nomi di tutti i file che trova a partire dalla path iniziale per tutto le sottodirectory che trova...
in se per se tutto fila...
per testarlo ,l'ho provato su "/"...
dopo 5 minuti che non si fermava l'ho killato e sono andato a vedere cosa stava scrivendo nel file...
guardando ho trovato:
home/ascia/scrivania/ascia/scrivania/ascia/scrivania/ascia/scrivania/ascia
...
uhm...
pensandoci bene ho capito...
in pratica io sulla scrivania ho un collegamento alla cartella ascia...
quindi l'algoritmo entra in ascia,scrive i files,pi trova la dir scrivania e ci entra dentro,scrive i files,poi ritrova ascia e ci entra,scrive i files,poi ritrova scrivania...e cosi via,sicuramente all'infinito...
la cosa strana e' che se faccio
CODICE
System.out.println(oFile.isFile)

dove oFile corrisponde a "/home/ascia/scrivania/ascia"
mi viene restituito false...
ma in teoria ascia,non e' una vera e propria cartella,ma un collegamento alla cartella ascia...
boh...idee?

edit,provato su windows analizzando C:\\ nessun errore,ho provato anche creando un collegamento al desktop sul desktop,tutto ok,il problema e' solo su linetto...

Edited by -AsCiA- - 1/10/2011, 02:33
 
Top
Doch88
CAT_IMG Posted on 1/10/2011, 14:43     +1   -1




Posta il source se puoi =)
 
Top
-AsCiA-
CAT_IMG Posted on 1/10/2011, 15:15     +1   -1




arriva...e' un bel po' disordinato pero' xD perche' e' tutto in fase di sviluppo xD quindi sono funzioni buttate qua e la finora xD

in pratica la funzione ricorsiva e' questa:

CODICE
private void recursiveFunction(File oFile,int iRecIndex) throws IOException{

               String[] sFileList;
               String pathname = oFile.getAbsolutePath();
               

               char cLevel = '-';
               int iRecursiveIndex = iRecIndex;

               if(oFile.isFile()){
                       for(int i=0; i<iRecursiveIndex; i++)
                       {
                               output(""+cLevel);
                       }
                       
                       output(oFile.getName()+'\n');

               }

               else if(oFile.isDirectory())
               {
                       sFileList = oFile.list();

                       output(""+'\n');
                       output("DIR---->" + oFile.getPath()+'\n');
                       

                       
                       for(int i=0; i<sFileList.length; i++){
                               try{
                               File nextFile = new File(pathname +File.separator+sFileList[i]);

                               recursiveFunction(nextFile,iRecIndex+1);
                               }
                               catch (NullPointerException e) {
                               }
                       }

               }

               else
               {
                       output("ERROR: " + oFile.getAbsolutePath() + " NOT FOUND");
               }

       }


c'e' ancora qualche problema sulla formattazione dell'output,piu' che altro c'e' un '\n' da sistemare...ma vabbe',quello e' secondario,poi ci penso :)
Il problema in pratica e' quello descritto nel primo post,cioe' che su linetto i collegamenti a cartelle li valuta come directory e non come file,quindi diventa infinito...
Su winzoz invece funziona tutto bene :)...

ah la funzione output() in pratica non fa altro che controllare in un if fatto su una apposita variabile intera se si e' scelto di scrivere il risultato in consolle o se scriverlo su file...

edit...
comunque il problema si verifica anche creando un oggetto file a associando una path di un collegamento ad una cartella...

se poi si prova a fare

CODICE
System.out.println(oggettoFile.isFile())

su windows restituisce correttamente true ma su linetto restituisce false,quindi lo vede come una directory e non come un file

Edited by -AsCiA- - 1/10/2011, 17:07
 
Top
Doch88
CAT_IMG Posted on 1/10/2011, 17:19     +1   -1




Ammetto di non essere sicuro della risposta, ma leggendo questo:

CITAZIONE
public boolean isFile()

Tests whether the file denoted by this abstract pathname is a normal file. A file is normal if it is not a directory and, in addition, satisfies other system-dependent criteria.

prova a fare un getCanonicalFile() prima delle operazioni. Altrimenti, se non funziona, cercando ho trovato questo pezzo di codice (Apache, licenza):
CODICE
public static boolean isSymlink(File file) throws IOException {
 if (file == null)
   throw new NullPointerException("File must not be null");
 File canon;
 if (file.getParent() == null) {
   canon = file;
 } else {
   File canonDir = file.getParentFile().getCanonicalFile();
   canon = new File(canonDir, file.getName());
 }
 return !canon.getCanonicalFile().equals(canon.getAbsoluteFile());
}


è una funzione che puoi usare per vedere se è un collegamento simbolico.
 
Top
-AsCiA-
CAT_IMG Posted on 2/10/2011, 23:14     +1   -1




grazie ^^ nn sono stato presente in questi giorni...
domani,o appena ho un po' di tempo provo una delle due soluzioni e ti faccio sapere :)
 
Top
-AsCiA-
CAT_IMG Posted on 4/10/2011, 10:31     +1   -1




sono riuscito a risolvere grazie al metodo che mi hai postato isSimlink()...
a dir la verita' nn ho ancora implementato,ma ho fatto un paio di System.out.println() su quella funzione passando diversi oggetti file e sembra funzionare bene,se gli passo un file o una cartella restituisce false,se gli passo un collegamento restituisce true...
quindi sembra essere ok...
grazie Doch...
Una cosa,non conosco benissimo il getCanonicalFile(),quindi non riesco a capire completamente cosa fa il metodo isSymlink(),su cosa si basa il risultato finale?
 
Top
5 replies since 1/10/2011, 00:49   80 views
  Share