2011-12-23 52 views
1

我有組成數百萬小文件到tar歸檔代碼,因此,我決定用我的Solaris機器上的/ tmp文件夾。然後我創建了一個ramdisk,而不是/ tmp我現在使用我創建的ramdisk(/ ramdata).. 這裏是我完成任務的地方:的Solaris 10,Java 6中,file.exists看不到現有的文件

首先,我嘗試在ramdisk中創建tar歸檔文件,目標目錄,但是當我這樣做時,java的File.exists()在文件存在時無法返回true。然後我將目錄更改爲磁盤上的目錄(opt/dist/dist1/cdrepo)以放入我的tar文件,並在那裏成功創建了tar文件,但是當文件存在時,File.exists()無法返回true。

然後我看到這個帖子Alternative to File.exists() in Java和我適時改變我的代碼,以便將NFS重置緩存,但它沒有工作也沒有。

任何人都可以提出關於爲什麼會發生任何解決方案或想法,我怎樣才能解決這個問題?謝謝大家。

我使用Java6U21,它是Solaris 10機..

下面

是我tryings的最終代碼..:我知道代碼中有我以前的tryings一些跡象 - 如德地方我實例化一個File對象,並檢查它的存在與fileExists變量......-這不會像預期的那樣工作,但因爲現在我只是想看到File.exists()的真實結果,我忽略它們。主要的例外是在線路czf.take_md5方法中,第一線,其是FileInputStream fis = new FileInputStream(filename);

public static synchronized void CreateZipFileFromSingleFolder(String folder,int CDNumber) throws Exception{ 

    CreateZipFile czf = new CreateZipFile(); 
     System.err.println(folder + " tarlaniyor..."); 
     Process p=null; 

     String tarName=CDFolderInfo.getID()+"_cd_"+CDNumber + ".tar "; 
     String tarFolder=CDFolderInfo.getPathRoot(); 
     //String komut = "tar -cf " + tarFolder+"/"+tarName+" "+ folder; 
     String komut = "tar -cf " + "/opt/dist/dist1/cdrepo/"+tarName+" "+ folder; 
     try { 
      System.err.println(komut + " ----- komutu ile tarlama yapilacak......."); 
      p = Runtime.getRuntime().exec(komut); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      p.waitFor(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.err.println("system exit value: " + p.exitValue()); 
     if(p.exitValue()==0) 
     { 
       Process p3=null; 
       p3=Runtime.getRuntime().exec("ls -l /opt/dist/dist1/cdrepo"); 
       p3.waitFor(); 
       if(p3.exitValue()==0) 
        System.err.println("LS CDREPO ICIN BASARILI OLARAK CALISTI..."); 

       /*Process p4=null; 
       p4=Runtime.getRuntime().exec("ls -l " +tarFolder+"/"+tarName); 
       p4.waitFor(); 
       if(p4.exitValue()==0) 
        System.err.println("LS TAR FOLDER ICIN BASARILI OLARAK CALISTI..."); 
       */ 

       File f2=new File("/opt/dist/dist1/cdrepo/"+tarName); 

       System.err.println("Absolute Path : "+f2.getAbsolutePath()); 
       System.err.println("   Path : "+f2.getPath()); 
       System.err.println("Canonical Path : "+f2.getCanonicalPath()); 
       System.err.println("is File : "+f2.isFile()); 
       System.err.println("Length : "+f2.length()); 
       System.err.println("is Hidden : "+f2.isHidden()); 

       if(f2.exists()) 
        System.err.println("Dosya cdrepoda..."); 
       else 
        System.err.println("dosya derepoda degil..."); 
       f2=null; 

       try { 
        czf.take_md5("/opt/dist/dist1/cdrepo/"+tarName); 
        System.err.println("MD5 alma succeed..."); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 



       /* 
       if(f2.exists()) 
        System.err.println("Tar tasima succeed.."); 
       else 
        System.err.println("move komutu basarili , ama dosyayi bulamiyorum..."); 
       f2=null;*/ 



      }else 
       System.err.println("p == 0 yanlis... Tar olusturma failed.."); 


      /*System.err.println("tar file existence will be checked..");*/ 
      File f=new File(tarFolder+"/"+tarName); 
      boolean fileExists = FileUtils.waitFor(f, 10); 
      if(fileExists){ 
       System.err.println("tar succeeded .... " + tarFolder+"/"+tarName); 
       System.err.println("tar file existence PASSED .."); 
      }else{ 
       System.err.println("tar process didnt fail, but actually failed..."); 
      } 
      f=null; 

     /* Process p2 = Runtime.getRuntime().exec("mv " + tarFolder+"/"+tarName+" "+ "cdrepo/"+tarName); 
      p2.waitFor();*/ 

     //if(p2.exitValue()==0){ 
       //System.err.println("p2 == 0 kontrolu dogru...."); 
       Process p1=null; 
       try { 
        p1 = Runtime.getRuntime().exec("rm -rf " + folder); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       try { 
        p1.waitFor(); 
        if(p1.exitValue()==0) 
         System.err.println("Dizin silme tamamlandı... " + folder); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       }  
    // } 
} 

並且輸出是:

/ramdata/cdtemp_125_1 tarlaniyor... 
tar -cf /opt/dist/dist1/cdrepo/125_cd_1.tar /ramdata/cdtemp_125_1 ----- komutu ile tarlama yapilacak....... 
system exit value: 0 
LS CDREPO ICIN BASARILI OLARAK CALISTI... 
Absolute Path : /opt/dist/dist1/cdrepo/125_cd_1.tar 
     Path : /opt/dist/dist1/cdrepo/125_cd_1.tar 
Canonical Path : /opt/dist/dist1/cdrepo/125_cd_1.tar 
is File : false 
Length : 0 
is Hidden : false 
dosya derepoda degil... 
java.io.FileNotFoundException: /opt/dist/dist1/cdrepo/125_cd_1.tar (No such file or directory) 
     at java.io.FileInputStream.open(Native Method) 
     at java.io.FileInputStream.<init>(FileInputStream.java:106) 
     at java.io.FileInputStream.<init>(FileInputStream.java:66) 
     at staticcdbuildernewver.CreateZipFile.take_md5(CreateZipFile.java:34) 
     at staticcdbuildernewver.OracleSideDbOps.CreateZipFileFromSingleFolder(OracleSideDbOps.java:723) 

,這是桁架命令的輸出即傑恩建議: 似乎它不能解析路徑:(但正如我在UNIX Linux的也不好,我不能非常明白它的意思..

/37: 1179.9948  write(2, " L S C D R E P O I C".., 41)  = 41 
/21: 1179.9948  lwp_cond_wait(0x08234D48, 0x08234D30, 0xB60D6C08, 0) = 0 
/21: 1179.9949  mprotect(0xFEC60000, 4096, PROT_READ)   = 0 
/37: 1179.9950   Incurred fault #6, FLTBOUNDS %pc = 0xFE4B49A1 
/37:   siginfo: SIGSEGV SEGV_ACCERR addr=0xFEC60280 
/37: 1179.9950   Received signal #11, SIGSEGV [caught] 
/37:   siginfo: SIGSEGV SEGV_ACCERR addr=0xFEC60280 
/21: 1179.9950  mprotect(0xFEC60000, 4096, PROT_READ|PROT_WRITE) = 0 
/37: 1179.9950  lwp_sigmask(SIG_SETMASK, 0xFFBFFEFF, 0x0000FFF7) = 0xFFBFFEFF [0x0000FFFF] 
/37: 1179.9951  setcontext(0xB5A6C1C0) 
/21: 1179.9951  mprotect(0xFEE20000, 4096, PROT_NONE)   = 0 
/21: 1179.9957  mprotect(0xFEE20000, 4096, PROT_READ)   = 0 
/21: 1179.9958  lwp_cond_signal(0x0849D448)      = 0 
/37: 1179.9958  lwp_cond_wait(0x0849D448, 0x0849D430, 0x00000000, 0) = 0 
/21: 1179.9959  lwp_cond_signal(0x084BDC48)      = 0 
/39: 1179.9959  lwp_cond_wait(0x084BDC48, 0x084BDC30, 0x00000000, 0) = 0 
/37: 1179.9959  write(2, "\n", 1)        = 1 
/39: 1179.9959  mprotect(0xB5BDC000, 12288, PROT_READ|PROT_WRITE) = 0 
/37: 1179.9960  write(2, "/o p t/d i s t/d i".., 15)  = 15 
/39: 1179.9960  lwp_sigmask(SIG_SETMASK, 0x00000004, 0x00000000) = 0xFFBFFEFF [0x0000FFFF] 
/37: 1179.9961  write(2, "\n", 1)        = 1 
/39: 1179.9961  lwp_sigmask(SIG_SETMASK, 0xFFBFFEFF, 0x0000FFF7) = 0xFFBFFEFF [0x0000FFFF] 
/37: 1179.9962  write(2, "\n", 1)        = 1 
/39: 1179.9962  lwp_exit() 
/37: 1179.9963  write(2, "/o p t/d i s t/d i".., 15)  = 15 
/37: 1179.9964  write(2, "\n", 1)        = 1 
/37: 1179.9964  write(2, "\n", 1)        = 1 
/37: 1179.9965  write(2, " A b s o l u t e P a t".., 52)  = 52 
/37: 1179.9966  write(2, "\n", 1)        = 1 
/37: 1179.9967  write(2, "     P a t".., 52)  = 52 
/37: 1179.9967  write(2, "\n", 1)        = 1 
/37: 1179.9968  resolvepath("/opt/dist/dist1/cdrepo/125_cd_1.tar ", 0xB5A6C3C0, 1024) Err#2 ENOENT 
/37: 1179.9969  resolvepath("/opt/dist/dist1/cdrepo", "/opt/dist/dist1/cdrepo", 1024) = 22 
/37: 1179.9970  write(2, " C a n o n i c a l P a".., 53)  = 53 
/37: 1179.9970  write(2, "\n", 1)        = 1 
/37: 1179.9971  stat64("/opt/dist/dist1/cdrepo/125_cd_1.tar ", 0xB5A6C6C0) Err#2 ENOENT 
/37: 1179.9972  write(2, " i s F i l e : f a".., 15)  = 15 
/37: 1179.9972  write(2, "\n", 1)        = 1 
/37: 1179.9973  stat64("/opt/dist/dist1/cdrepo/125_cd_1.tar ", 0xB5A6C700) Err#2 ENOENT 
/37: 1179.9974  write(2, " L e n g t h : 0", 10)   = 10 
/37: 1179.9975  write(2, "\n", 1)        = 1 
/37: 1179.9975  stat64("/opt/dist/dist1/cdrepo/125_cd_1.tar ", 0xB5A6C6C0) Err#2 ENOENT 
/37: 1179.9976  write(2, " i s H i d d e n : ".., 17)  = 17 
/37: 1179.9977  write(2, "\n", 1)        = 1 
/37: 1179.9977  write(2, "/o p t/d i s t/d i".., 15)  = 15 
/37: 1179.9978  write(2, "\n", 1)        = 1 
/37: 1179.9979  write(2, "\n", 1)        = 1 
/37: 1179.9979  stat64("/opt/dist/dist1/cdrepo/125_cd_1.tar ", 0xB5A6C700) Err#2 ENOENT 
/37: 1179.9980  write(2, " d o s y a d e r e p o".., 23)  = 23 
/37: 1179.9980  write(2, "\n", 1)        = 1 
/37: 1179.9981  open64("/opt/dist/dist1/cdrepo/125_cd_1.tar ", O_RDONLY) Err#2 ENOENT 
/37: 1179.9983  write(2, " j a v a . i o . F i l e".., 95)  = 95 
/37: 1179.9984  write(2, "\n", 1)        = 1 
/37: 1179.9986  write(2, "\t a t j a v a . i o .".., 47)  = 47 
/37: 1179.9986  write(2, "\n", 1)        = 1 
/37: 1179.9987  write(2, "\t a t j a v a . i o .".., 60)  = 60 
/37: 1179.9987  write(2, "\n", 1)        = 1 
/37: 1179.9988  write(2, "\t a t j a v a . i o .".., 59)  = 59 
/37: 1179.9988  write(2, "\n", 1)        = 1 
/37: 1179.9989  write(2, "\t a t s t a t i c c d".., 71)  = 71 
/37: 1179.9990  write(2, "\n", 1)        = 1 
/37: 1179.9990  write(2, "\t a t s t a t i c c d".., 97)  = 97 
/37: 1179.9991  write(2, "\n", 1)        = 1 
/37: 1179.9991  write(2, "\t a t s t a t i c c d".., 68)  = 68 
/37: 1179.9992  write(2, "\n", 1)        = 1 
/37: 1179.9993  write(2, "\t a t s t a t i c c d".., 87)  = 87 
/37: 1179.9993  write(2, "\n", 1)        = 1 
/37: 1179.9994  write(2, "\t a t s t a t i c c d".., 55)  = 55 
/37: 1179.9995  write(2, "\n", 1)        = 1 
/37: 1179.9995  write(2, "\t a t j a v a . l a n".., 41)  = 41 
+0

難道說的Solaris用戶不有足夠的訪問權限來獲取目錄中的文件列表? – bezmax 2011-12-23 08:33:00

+0

我使用這個Java程序從一個SSH連接窗口,並與root用戶連接..是否有任何情況下,根目錄不會有目錄列表權限? – iteyran 2011-12-23 08:54:48

+0

Ramdisk不是NFS安裝的。 – 2011-12-23 08:56:42

回答

1

所有問題的關鍵在於,在tarName變量defitinion額外的空間..只是刪除多餘的空格..和一切工作都正常..

0

只有試試

if(f2.exists()) 
    System.err.println("Dosya cdrepoda..."); 
else { 
    System.err.println("dosya derepoda degil..."); 
    f2.getParentFile().mkdirs(); 
} 
+0

所有必需的目錄預先創建..但我想f2.exists()返回true,在這種情況下,你只是做一個行爲,當它是假的,這意味着我仍然會有錯誤..如果我誤解了請澄清.. – iteyran 2011-12-23 08:46:23