Fájl másolási probléma

Fájl másolási probléma
2012-07-30T11:29:08+02:00
2012-07-30T18:15:24+02:00
2022-11-26T11:25:40+01:00
Elipapa
Sziasztok!
Írtam egy egyszerű kis programot, ami fájlok hálózati meghajtóra történő másolását végzi óránként. Az lenne vele a problémám, hogy az első fájlt nem törli le (valamiért beakad) és minden egyes alkalommal átmásolja, amire nekem nincs szükségem, mert van egy backup mappám, amibe szintén beteszi.


package Copy; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /** * * @author Elipapa */ public class FileCopy { protected Copy copy; SimpleDateFormat sdf; String date; public FileCopy(Copy copy) { this.copy = copy; sdf = new SimpleDateFormat("MM-dd"); Calendar c = Calendar.getInstance(); c.setTimeInMillis(System.currentTimeMillis()); date = sdf.format(c.getTime()); File backUpDir = new File(".\BackUpTxt\" + date); File txtDir = new File(".\TxtBackUpDir"); if(!backUpDir.exists()) { backUpDir.mkdir(); } if(!txtDir.exists()) { txtDir.mkdir(); } } private void runBat() { try { Runtime run = Runtime.getRuntime(); Process p = run.exec("halozati-megh.bat"); } catch (IOException ex) { writeLog(ex.toString(), "runBat"); } } public void copyFileIfExist(int day, boolean bol) throws Exception { List<File> files = this.getFiles(copy.getForrasMeghajto(), day, bol); runBat(); Thread.sleep(5000); for(File file : files) { try { writeFile(file, ".\BackUpTxt\" + date + "\"); writeFile(file, copy.getCelMeghajto() + "\"); file.delete(); } catch (Exception ex) { writeLog(ex.toString(), " Fájl másolása 1.próba " + file.getName()); runBat(); try { Thread.sleep(60000); writeFile(file, copy.getCelMeghajto() + "\"); file.delete(); } catch (Exception ex1) { writeLog(ex1.toString(), " Fájl másolása 2.próba " + file.getName()); } } } } private boolean isXml(File file) { boolean bol = false; String filename = file.getName(); if(file.getName().toLowerCase().endsWith("xml")) { bol = true; } if(file.getName().toLowerCase().endsWith("txt")) { try { writeFile(file, ".\TxtBackUpDir\"); file.delete(); } catch (FileNotFoundException ex) { this.writeLog(ex.toString(), "isXmlerror" + file.getName()); } catch (IOException ex) { this.writeLog(ex.toString(), "isXmlerrorio" + file.getName()); } catch (Exception ex) { this.writeLog(ex.toString(), "isXmlerrorEx" + file.getName()); } } return bol; } private List<File> getFiles(File from, int day, boolean bol) { File folder = from; File[] listOfFiles = folder.listFiles(); List<File> goodFiles = new ArrayList<File>(); if(bol) { for(File file : listOfFiles) { if(getDateOfCreate(file) != day && isXml(file)) { goodFiles.add(file); } } } if(!bol) { for(File file : listOfFiles) { if(isXml(file)) { goodFiles.add(file); } } } return goodFiles; } private int getDateOfCreate(File file) {/* String[] day = null; try{ Process proc = Runtime.getRuntime().exec("cmd /c dir " + file + " /tc"); BufferedReader br = new BufferedReader( new InputStreamReader(proc.getInputStream())); System.out.println(br.readLine()); String data =""; //it's quite stupid but work for(int i=0; i<6; i++){ data = br.readLine(); System.out.println(data); } //split by space //StringTokenizer st = new StringTokenizer(data); //String date = st.nextToken();//Get date data = data.replace(".", " "); day = data.split(" "); }catch(IOException e){ writeLog(e.toString(), "getDateOfCreate()"); System.out.println(e.toString()); } return Integer.parseInt(day[2]);*/ SimpleDateFormat sd = new SimpleDateFormat("dd"); int da = Integer.parseInt(sd.format(file.lastModified())); System.out.println(da); return da; } private void writeFile(File file, String locate) throws FileNotFoundException, IOException, Exception { InputStream in = new FileInputStream(file); OutputStream out = new FileOutputStream(locate + file.getName()); try { byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } } catch(Exception ex) { throw new Exception("Hiba: " + ex.toString()); } finally { in.close(); out.close(); } } public void writeLog(String errorMsg, String str) { try { File logDir = new File(".\Log\" + date); if (!logDir.exists()) { logDir.mkdir(); } PrintWriter pw = new PrintWriter(".\Log\" + date + "\" + str + ".txt"); pw.print(errorMsg + "\n"); pw.close(); } catch (IOException e) { System.out.println(e.toString()); } } }
Mutasd a teljes hozzászólást!
Akkor amit tehetsz:
- debuggolj, tegyel a deletehez breakpointot, es nezd meg hogy mi tortenik
- masreszrol ezt hogy sima Exception-t kapsz el, nagy butasag.. miert nem azt kapod el amit valoban dobhat?
Mutasd a teljes hozzászólást!

  • Eleg lett volna a relevans reszt bemasolni, en ezt most nem nezem at. Mutasd hol varod hogy kitorolje az elso fajlt?
    Mutasd a teljes hozzászólást!

  • public void copyFileIfExist(int day, boolean bol) throws Exception { List<File> files = this.getFiles(copy.getForrasMeghajto(), day, bol); runBat(); Thread.sleep(5000); for(File file : files) { try { writeFile(file, ".\BackUpTxt" + date + ""); writeFile(file, copy.getCelMeghajto() + ""); file.delete(); } catch (Exception ex) { writeLog(ex.toString(), " Fájl másolása 1.próba " + file.getName()); runBat(); try { Thread.sleep(60000); writeFile(file, copy.getCelMeghajto() + ""); file.delete(); } catch (Exception ex1) { writeLog(ex1.toString(), " Fájl másolása 2.próba " + file.getName()); } } } }
    és itt

    private void writeFile(File file, String locate) throws FileNotFoundException, IOException, Exception { InputStream in = new FileInputStream(file); OutputStream out = new FileOutputStream(locate + file.getName()); try { byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } } catch(Exception ex) { throw new Exception("Hiba: " + ex.toString()); } finally { in.close(); out.close(); } }
    Mutasd a teljes hozzászólást!
  • Hibauzenet nincs? Probaltad vegigdebuggolni? Probaltad kezzel megadni az eleresi utat es ugy torolni?

    Egyebkent a file.delete()-nek van visszateresi erteke, boolean, hogy sikerult-e torolni vagy nem. Nezted ezt mar?
    Mutasd a teljes hozzászólást!
  • Debuggoltam és teszteltem is egy jó pár alkalommal, a másolás megtörténik. Csak akkor nem törli ki a fájlt, ha azt elsőre nem sikerül átmásolni. Sajnos a hálózat nem a legstabilabb, ezért csináltam a runbat() függvényt, ami újracsatolja a hálózati meghajtókat. Én arra gyanakodtam, hogy nem jut el a file.delet()-ig, de a log fájlt nem is csinált a második próbához, csak az elsőhöz. Tehát itt az első try nem megy végig, ezért nem jut el a file.delet()-ig. De a második try nem dob kivételt.
    try { writeFile(file, ".\BackUpTxt" + date + ""); writeFile(file, copy.getCelMeghajto() + ""); file.delete(); } catch (Exception ex) { writeLog(ex.toString(), " Fájl másolása 1.próba " + file.getName()); runBat(); try { Thread.sleep(60000); writeFile(file, copy.getCelMeghajto() + ""); file.delete(); } catch (Exception ex1) { writeLog(ex1.toString(), " Fájl másolása 2.próba " + file.getName()); }
    Mutasd a teljes hozzászólást!
  • De akkor ezt miert nem rekurzivan oldod meg, es akkor nemkell ennyi egybeagyazott dolog. Amikor hiba van ujra meghivod a fv-ed.

    Én arra gyanakodtam, hogy nem jut el a file.delet()-ig

    Ha debuggoltad, akkor tudod, hogy eljut-e a file.deleteig vagy nem.
    Mutasd a teljes hozzászólást!
  • Azért nem rekurzívan oldottam meg, mert csak kétszer próbálkozik a másolással. Ha nemsikerül, akkor egy másik osztály egy óra múlva megint elindítja az egészet előről. A hiba az szokott lenni, hogy a célmeghajtó nem érhető el és ez akasztja ki valahol.
    Mutasd a teljes hozzászólást!
  • Ja ertem. Es ha nem szakad meg a halozati kapcsolat akkor sikeresen torli a fajlt? Probaltad mar ugy csinalni, hogy sajatgepen csinalod es nem halon?

    Ugy is jelentkezik a hiba?
    Mutasd a teljes hozzászólást!
  • Igen próbáltam és úgy hibátlanul működik.
    Mutasd a teljes hozzászólást!
  • Akkor amit tehetsz:
    - debuggolj, tegyel a deletehez breakpointot, es nezd meg hogy mi tortenik
    - masreszrol ezt hogy sima Exception-t kapsz el, nagy butasag.. miert nem azt kapod el amit valoban dobhat?
    Mutasd a teljes hozzászólást!
  • Megtaláltam a hibát, valamiért nem zárta be a fileinputstreamet. :S
    Mutasd a teljes hozzászólást!
  • ... mert ha a writeFile metódus első sora dobja a kivételt, az alább található finally blokkban lévő zárás sosem hajtódik végre, mivel a stream nyitását try blokk nem felügyeli.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd