christian: Datei kann nicht aus Programm kopiert werden

hi

also ich plage mich nun schon gut 3 tage mit diesen Problem herum. Meine nun letzte Hoffnung wird wohl mal dieser weg sein. Aber das nur so nebenbei!

Mein Programm liest ein Verzeichnis aus meiner Festplatte aus. In diesen verz. sind mp3s. Aus dieser lese ich mir die id3 daten heraus und kann so playlisten einfach zusammen-klicken. geht auch.

so nun soll wenn ich eine datei aus der Liste angeklickt habe, diese auch in ein anderes Verz. verschoben werden. Auch diese methoden (exec usw) habe ich scho eingebunden. Allerdings wird die Datei einfach nicht verschoben. Dann habe ich einfach direkt in den code einen Dateinamen eingetragen. Dies hat funktioniert! Dann habe ich mir mit println das ausgegeben was ich dann der exec methode übergebe (das aus meiner JList) ist auch so richtig gewesen. So weit so schlecht.dann habe ich das, was ich mir ausgegeben haben lasse direkt auf der cmd eingegeben. Dann sagte er das der Prozess nciht ausgeführt werden kann weil gerade ein anderer Prozess darauf zugreift(mein Programm). SO!

Aber, dann habe ich alles mögliche  was mit der Datei zutun hatte auf "null" gesetzt. Alle vectoren und die JList die noch eine Referenz auf diese Datei gespeichert hatten, habe ich mit der methode remove für die Vetoren und removeElementAt für die Jlist aufgerufen. Aber wie nicht anders zu erwarten immer noch das selbe!

Nun endlich zu meiner Frage: reicht das mit "null" und remove, removeElementAt um die datei freizugeben?

Bin für jeden weiteren Tip Dankbar!

Der Roman ist nun zu ende, genau wie ich mit meinen Latein:-(

grüße christian

  1. Hi,

    so nun soll wenn ich eine datei aus der Liste
    angeklickt habe, diese auch in ein anderes Verz.
    verschoben werden. Auch diese methoden (exec usw)
    habe ich scho eingebunden. Allerdings wird die Datei
    einfach nicht verschoben.

    sondern? Nicht, daß ich irgendwas von Java verstehen
    würde - aber von Funktionen einer solchen Programmier-
    sprache erwarte ich eigentlich, daß sie eine Fehler-
    meldung zurückliefern oder wenigstens eine Returncode.

    Dann habe ich einfach direkt in den code einen
    Dateinamen eingetragen. Dies hat funktioniert!

    Es verdachtet sich ein Verdicht:
    Kann es sein, daß Du relative Pfadnamen verwendest
    und von einer falschen Basis aus adressierst?

    Dann habe ich mir mit println das ausgegeben was
    ich dann der exec methode übergebe (das aus meiner
    JList) ist auch so richtig gewesen.

    Und zwar? (Absolut / relativ?)

    Viele Grüße
          Michael

    1. hi

      sondern? Nicht, daß ich irgendwas von Java verstehen
      würde - aber von Funktionen einer solchen Programmier-
      sprache erwarte ich eigentlich, daß sie eine Fehler-
      meldung zurückliefern oder wenigstens eine Returncode.

      nein, das tut es nicht

      Es verdachtet sich ein Verdicht:
      Kann es sein, daß Du relative Pfadnamen verwendest
      und von einer falschen Basis aus adressierst?

      nein das kann nicht sein weil ich mir den kompletten befehl auf der befehlszeile ausgeben lasse(der eigentlich im Programm ausgeführt werden soll) und 1 zu 1 abgetippt habe und dort kommt eine Meldung das auf die Datei verschoben werden kann weil sie vom anderen Programm noch verwendet wird.

      Und zwar? (Absolut / relativ?)

      nein sonst würde mir nicht die oben genannte Fehler-meldung angezeigt werden, sondern das die datei nicht gefunden wird

      grüße christian

      1. Hallo,

        nein das kann nicht sein weil ich mir den kompletten befehl auf der befehlszeile ausgeben lasse(der eigentlich im Programm ausgeführt werden soll) und 1 zu 1 abgetippt habe und dort kommt eine Meldung das auf die Datei verschoben werden kann weil sie vom anderen Programm noch verwendet wird.

        Dann hast du vermutlich die Datei nach dem Einlesen des ID3-Tags
        nicht wieder geschlossen oder hälst sie anderweitig offen. Nur ein
        File-Objekt auf eine Datei zu haben, verhindert nämlich den
        schreibenden Zugriff auf die Datei nicht. Guck mal, ob du evtl.
        das "close()" vergessen hast, nachdem du das ID3-Tag ausgelesen hast.
        Ansonsten poste doch einfach mal den relevanten Teil deines Codes
        hier. Vielleicht bringt uns das schon ein bißchen weiter.

        Gruß
        Slyh

        1. hi

          Ansonsten poste doch einfach mal den relevanten Teil deines Codes
          hier. Vielleicht bringt uns das schon ein bißchen weiter.

          Die id3 klassen haben leider keine close methode (leider).
          geht leider ziemlich schlecht weil der code bereits über 2000 zeilen hat und quer verteilt die zugriffe auf die mp3s! werds mal versuchen

          die methode zum auslesen der Verzeichnisses:

          void actShareFiles() (nehme die catch blöcke raus)
              {
                  try
                  {
             File[] tmp =  folder1.listFiles();
                String tmpStr;
                for(int i = 0; i < tmp.length;i++)
                {
                 tmpStr = tmp[i].getPath();
                 if(tmpStr.endsWith(".mp3"))
                 {
                  try
                  {
                      MP3File tmpmp3 = new MP3File(tmpStr);
                id3 = new ID3(tmpmp3);
                   if(!(id3.checkForTag()))
                   {
                       ID3Dlg dlg = new ID3Dlg(this, "Keine ID3 gefunden", true, tmpStr, id3);
                       id3.writeTag();
                   }
                   else if(id3.getArtist().length() < 3)
                    {
                       ID3Dlg dlg = new ID3Dlg(this, "Keine Vollständige ID3", true, tmpStr, id3);
                       id3.writeTag();
                   }
                   else if(id3.getTitle().length() < 3)
                   {
                       ID3Dlg dlg = new ID3Dlg(this, "Keine Vollständige ID3", true, tmpStr, id3);
                       id3.writeTag();
                   }

          shareData.add(id3.getArtist() + " - " + id3.getTitle());
                mp3files.add(id3);
                pathName.add(tmpStr);
                tmpmp3 = null;
               }
                    id3 = null;
               tmpStr = null;

          }

          }
             for (int i = 0; i < shareData.size(); i++)
             {
               model.addElement(shareData.elementAt(i));
             }
            }
            catch(Exception e)
            {
              statuszeile.setText("Allgemeiner Fehler");
            }
           }

          und die wo in die playlist geschrieben wird(actionperformed auch wieder ohne catch blöcke):

          public void actionPerformed(ActionEvent e)
              {   try
                 {
                    String aktplayPath = (String)pathListen.elementAt(playlisten.getSelectedIndex());
                    FileWriter playlist = new FileWriter(aktplayPath, true);
                   BufferedWriter bufw = new BufferedWriter(playlist);
                    int[] allSelFiles = shareList.getSelectedIndices();
                    if(shareList.getSelectedIndex() != -1)
                    {
                    for (int i = 0; i < allSelFiles.length;i++)
                    {
                        System.out.println("h " + allSelFiles[i]);
                     ID3 buf = getMp3File(allSelFiles[i]);
                     model.removeElementAt(allSelFiles[i]);
                     mp3files.remove(allSelFiles[i]);
                     shareData.remove(allSelFiles[i]);
                     String titel = buf.getTitle();
                     String artist = buf.getArtist();
                     buf = null;
                     String path = (String)pathName.elementAt(allSelFiles[i]);
                     MP3File filebuf = new MP3File(path);
                     String leange = Long.toString(filebuf.getLength());
                     bufw.newLine();
                    bufw.write("#EXTINF:"+leange+","+artist+ " - " +titel);
                     bufw.newLine();
                    bufw.write(path);
                    bufw.close();
                    playlist.close();
                    filebuf = null;
                    pathName.remove(allSelFiles[i]);
                    id3 = null;
                    try
                         {
                            int lastbuffer = aktplayPath.lastIndexOf("\");
                            String mysubstr = aktplayPath.substring(0, lastbuffer);
                            System.out.println("cmd /c move "" + path + "" "" + mysubstr + """);
                            System.out.println(path + " " + aktplayPath);
                              Runtime rt =Runtime.getRuntime();
                              Process p = rt.exec("cmd /c move "" + path + "" "" + mysubstr + """);
                              System.out.println("test");
                         }

          }
                  }
                  else
                  {
                      statuszeile.setText("kein File ausgewählt");
                  }
                 bufw.close();

          }

          }
            }