Vector verliert Daten beim Rücksprung im Konstruktor

Status
Nicht offen für weitere Antworten.

metacube

Neues Mitglied
hallo Zusammen
ich bin ein C auf Java umsteiger und neu hier.

. Ich schreibe gerade ein Programm das ein Ordner überwacht und Neueinträge oder gelöschte Files anzeigt.

Jetzt habe ich das Problem das der Vector folderOnFilelistIndex und folderOndiskIndex beim Rücksprung wieder auf NULL steht. gleichzeitig könnt ihr vieleicht noch eine Inspiration geben, ob einige Methoden noch schöner mit OOP zu lösen sind


Code:
import java.io.IOException;
import java.util.Vector;

import javax.swing.JFrame;

public class Manager {

	Manager() {
	}
	public static void main(String[] args) throws IOException {
		
	FolderControll fm= new FolderControll("C:\\diff\\","c:\\index.dat");// analyse folder    compare file //$NON-NLS-2$
//		Gui graf=new Gui();
//		
//		graf.display(fm.getrightTree(),fm.getrightTree());
		System.out.println("gespeicherte folder (voriger zustand) "+fm.getleftTree());
		
		System.out.println("aktueller daten im folder (neu) "+fm.getrightTree());
		
	//	fm.displayFolderDifferenz();
		
	}
}


import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Vector;

public class FolderControll {

	// speichert die gefundenen Dateienlisten in einer Datei
	// oder holt sie von der Datei
	// kurz -> file io
	// Anfang Variablen
	private String location = "";
	private String filename = "";
	private File[] fy;
	RandomAccessFile rFile = null;
	public Vector folderOnFilelistIndex = new Vector() ;
	private Vector folderOndiskIndex = new Vector();
	
	
	FolderControll(String location, String fina) throws IOException {
		
		this.setlocation(location);
		this.setFilename(fina);
		this.getLeftFolderfrmDisk(); // RETURN INDEX frm FILE		
		this.storeIndexToFile(fina, this.scanFolderStructure(0));
		this.scanFolderStructure(0); // RET Index LIVE
		System.out.println("Folderkontroller bereit...");
	}

	// lesen des Folders on disk
	
	
	
	public void setlocation(String loc) {
		location = loc;
	}

	public String getFilename() {
		return filename;
	}

	public void setFilename(String filename) {
		this.filename = filename;
	}

	public Vector getleftTree() {
		return folderOnFilelistIndex;
	}

	public Vector getrightTree() {
		return folderOndiskIndex;
	}

	

	
	
	
	private Vector scanFolderStructure(int foldchk) {
		int x = 0;
		// dname.createNewFile(); // falls das file nicht existiert erstellen.
		File dname = new File(location);
		fy = dname.listFiles();
		while (x < fy.length - 1) {
			x++;
			if (foldchk == 0) {
				if (fy[x].isDirectory())
					folderOndiskIndex.addElement("Ordner "
							+ fy[x].toString().trim());
				else
					folderOndiskIndex.addElement(this.fy[x].toString().trim());
			} else {
				folderOndiskIndex.addElement(fy[x].toString().trim());
			}
		}
		return folderOndiskIndex;
	}

	// speichern vom file(ordnerstrukt)

	private void storeIndexToFile(String filen, Vector fn) throws IOException {
		int z = 0;

		// dname = new File(db_loc);
		rFile = new RandomAccessFile(filename, "rw");			
		while (z < fn.size() - 1) {
			z++;
			this.rFile.seek(rFile.length());
			if ((fn.elementAt(z).toString().length() < 2 || fn.elementAt(z) == null)) {
				rFile.writeChars(System.getProperty("line.separator"));
			} else {
				rFile.writeBytes(fn.elementAt(z).toString() + '\13');
			}
		}
	}

	// laden vom file(ordnerstrukt)

	private void getLeftFolderfrmDisk() throws IOException {

		Vector folderOnFilelistIndex;
		folderOnFilelistIndex = new Vector();
		String line;

		if (new File(filename).exists() != true) {
			this.storeIndexToFile(filename, scanFolderStructure(0));
			this.folderOndiskIndex.clear();
			this.folderOnFilelistIndex.clear();
		}
			RandomAccessFile f;
			f = new RandomAccessFile(filename, "r");
			while ((line = f.readLine()) != null)
			{
				folderOnFilelistIndex.addElement(line);
			}
			f.close();
			// File or directory exists
		// return folderOnFilelistIndex;
	}

	public void displayFolderDifferenz() throws IOException {
		FolderComperator l = new FolderComperator(getleftTree(),getrightTree());//		
		l.compareFileList();
	}

}

[code]
import java.util.Vector;

public class FolderComperator {

private Vector leftData = new Vector();
private Vector rightData = new Vector();
private Vector geloescht = new Vector();
private Vector neufolder = new Vector();

FolderComperator(Vector leftData, Vector rightData)
{
this.leftData = leftData;
this.rightData = rightData;
}

private String findFolder(Vector ff, String foName) {
int rc;
String resi = "";
for (rc = 0; rc < ff.size(); rc++) {
if (foName == ff.elementAt(rc)) {
resi = foName;
break;
}
}
return resi;
}

public void compareFileList() {

Vector leftDa = leftData;
Vector rightDa = rightData;
// fileIndexToLoad.contains(elem)
int rc;
int lc;
String gefOrdner;
// Vector altDeletedEntry = leftData;//

for (lc = 0; lc <= rightDa.size() - 1; lc++) {
gefOrdner = findFolder(rightDa, leftDa.elementAt(lc).toString());
if (leftDa.elementAt(lc) == gefOrdner)
;//System.out.println("no chances"); // ordner immernoch da
else
//if (leftDa.elementAt(lc)!=findFolder(rightDa,leftDa.elementAt(lc).toString()))// add gelöschter ordner und neu an position
{
this.geloescht.add(leftDa.elementAt(lc));
System.out.println("geloeschter Ordner " + leftDa.elementAt(lc));
}
}
for (rc = 0; rc <= rightDa.size() - 1; rc++) {
if (rightDa.elementAt(rc) == findFolder(leftDa, rightDa.elementAt(
rc).toString()))
;// System.out.print("nc"); // ordner immernoch da
else
{
this.neufolder.add(rightDa.elementAt(rc));
System.out.println("neuer Ordner " + rightDa.elementAt(rc));
}
}
}
}
[/code]

für eure Hild wäre ich dankbar
 
Moin,

ich habe mir die Methode scanFolderStructure angeguckt.

Das Programm läuft garnicht in die while-Schleife!

X ist 0 und fy.length-1 ist auch 0, da nur C:/diff gefunden wurde.

So sieht meine Fkt. aus:


Code:
 private Vector scanFolderStructure(int foldchk) { 
      int x = 0; 
      // dname.createNewFile(); // falls das file nicht existiert erstellen. 
      File dname = new File(location); 
      fy = dname.listFiles(); 
      while (x <= fy.length-1) { //// ACHTUNG <= 
         if (foldchk == 0) { 
            if (fy[x].isDirectory()) {
               folderOndiskIndex.addElement("Ordner " 
                     + fy[x].toString().trim()); 
            }
            else 
               folderOndiskIndex.addElement(this.fy[x].toString().trim()); 
         } else { 
            folderOndiskIndex.addElement(fy[x].toString().trim()); 
         } 
         x++; ///// Achtung an das Ende die Schelife gestetzt
      } 
      System.out.println("Anzahl:"+folderOndiskIndex.size());
      return folderOndiskIndex; 
   }

Bernd Enders
 
genau das 🙂

hier noch ein paar kleine Verbesserungen

Code:
   private Vector scanFolderStructure(boolean checkFolder) {  // Warum einen int benutzen, wenn du hier einen boolean verwenden kannst
      int x = 0; 
      // dname.createNewFile(); // falls das file nicht existiert erstellen. 
      File dname = new File(location); 
      fy = dname.listFiles(); 
      int dirSize = fy.length;
      while (x < dirSize) { //// ACHTUNG <= 

         // da beide else-Zweige das selbe gemacht haben, einfach beide Bedingung zusammen ziehen. && bewirkt hier, 
         // dass der nachfolgende Ausdruck nur bewertet wird, falls der vorhergehende wahr ist
         // den else-Zweig selbst kannst du dir hier dann auch direkt schenken, da du im Prinzip bei beiden Zweigen 
         // die gleiche Operation ausführst und nur ein "Ordner " davor schreibst.

         String fileOrFolderName  = fy[x].toString().trim();
         if (checkFolder && fy[x].isDirectory()) { 
           fileOrFolderName = "Ordner " + fileOrFolderName;
         }
         folderOndiskIndex.addElement(fileOrFolderName); 
         x++; ///// Achtung an das Ende die Schelife gestetzt
      } 
      System.out.println("Anzahl:"+folderOndiskIndex.size());
      return folderOndiskIndex; 
   }


Allgemein solltest du dir, imho, angewöhnen, sprechende Namen zu benutzen 🙂 ... fy ist etwas nichts sagend *G* .. und "getter"-Ketten
Code:
fn.elementAt(z).toString().length()
sind, meiner Meinung nach, auch etwas unschön und grade beim Debuggen/Fehlermeldungen störend bzw. hinderlich ...

Noch was, was mir aufgefallen ist? .. *grübel* .. achja ... wenn du Schleifen benutzt, die über ein Array o.Ä. laufen, solltest du die Größe des Arrays vorher auslesen und nicht jedesmal die size oder length Methode aufrufen. Ist zum einen bei der Fehlersuche schöner, zum anderen vereinfacht es das lesen und das Debuggen meiner Erfahrung nach ...

Grüße

Ntak
 
Wenn Du Java5 oder höher einstetz, solltest Du auch den Typ der Vector-Elemente angeben.
Stichwort Generics.

Vector<String> = new Vector<String>();
 
viele Danke für eure Hilfe. geht ja richtig schnell hier 🙂
Das Problem konnte ich lösen und hab den Code nach euren Empfehlungen angepasst.

in der Methode getLeftFolderfrmDisk() wurde am Anfang
das Objekt mit folderOnFilelistIndex = new Vector();
nochmals neu erzeugt und somit die alte Instanz überschrieben. Jetzt wird die Objektliste sauber übergeben.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben