2014-09-04 144 views
0

我一直在試圖將文件從一個位置複製到另一個位置。據我的理解,我的程序的複製機制工作正常,但是當我運行應用程序時,我經常得到一個文件路徑錯誤。我恰好在使用xbmc應用程序中的數據文件。Android文件複製:路徑錯誤

AssetManager - > addDefaultAssets CIP路徑不exsit /data/data/org.xbmc.xbmc/.xbmc/userdata/guisettings.bak:打開失敗:ENOENT(沒有這樣的文件或目錄)

當我爲字符串路徑創建File對象時,問題似乎就會發生。這裏是程序的該部分的代碼片段:

File inputFile = new File(inputPath); 
File outputFile = new File(outputPath); 

無論我如何嘗試訪問這些文件,我都會收到上述錯誤。我試圖使用File,FileInputStream和Uri庫來獲取沒有運氣的文件路徑。我可以有寫權限的問題,或者我只是沒有正確指定文件路徑?我發佈了整個解決方案,以防問題出在代碼中的其他地方。

public class myActivity extends Activity { 
    private static final String TAG = "myActivity.java"; 
    //The package name representing the application directory that is to be accessed 
    String packageName = "org.xbmc.xbmc"; 
    //The input filename to read and copy 
    String inputFileName = "guisettings.bak"; 
    //The output filename to append to 
    String outputFileName = "guisettings.xml"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 
     //Check the status of the external storage 
     if(isExternalReady()) { 
      //The external file system is ready 
      //Start the specific file operation 
      restoreFile(); 
     } else { 
      //Not ready. Create a Broadcast Receiver and wait for the filesystem to mount 
      BroadcastReceiver mExternalInfoReceiver = new BroadcastReceiver() { 
       @Override 
       public void onReceive(Context arg0, Intent intent) { 
        //The external filesystem is now mounted 
        //Start the specific file operation 
        restoreFile(); 
       } 
      }; 
      //Get the IntentFilter Media Mounted 
      IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED); 
      //Specify the filesystem data type 
      filter.addDataScheme("file"); 
      //Register the receiver as "mExternalInfoReceiver" with the Media Mount filter 
      registerReceiver(mExternalInfoReceiver, new IntentFilter(filter)); 
     } 
    } 

    //Restore the specific xml file 
    public void restoreFile() { 
     /* 
     //Get the internal storage of this app (Android/data/com.website.appname/files/) 
     String internalStorage = Environment.getFilesDir(); 
     //Get the external storage path now that it is available 
     String externalStorage = Environment.getExternalStorageDirectory().toString(); 
     //The directory of the file desired 
     String filePath = "Android/data/org.xbmc.xbmc/files/.xbmc/userdata/"; 
     */ 
     //The information of the desired package 
     ApplicationInfo desiredPackage; 
     //Get the path of the application data folder if the application exists 
     try { 
      //Get the info of the desired application package 
      desiredPackage = getPackageInfo(packageName); 
     } catch (Exception e) { 
      //Output the stack trace 
      e.printStackTrace(); 
      //Stop the function 
      return; 
     } 
     //Get the data dir of the package 
     String rootPackageDir = desiredPackage.dataDir; 
     //The path to the file in the package 
     String packageFilePath = "/.xbmc/userdata/"; 
     //Construct the complete path of the input and output files respectively 
     //based on the application path 
     String inputPath = String.format("%s%s%s", rootPackageDir, packageFilePath, inputFileName); 
     String outputPath = String.format("%s%s%s", rootPackageDir, packageFilePath, outputFileName); 
     try { 
      //Copy the input file to the output file 
      if(copyFile(inputPath, outputPath)) { 
       //The file has been successfully copied 
       //Exit the application 
       System.exit(0); 
      } 
     } catch (IOException e) { e.printStackTrace(); return; } 
    } 

    //Is the external storage ready? 
    public boolean isExternalReady() { 
     //Get the current state of the external storage 
     //Check if the state retrieved is equal to MOUNTED 
     Boolean isMounted = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); 
     if(isMounted) { 
      //The external storage is ready 
      return true; 
     } 
     //The external storage is not ready 
     return false; 
    } 

    //Get the data dir of a specific app if it exists 
    public ApplicationInfo getPackageInfo(String packageName) throws PackageNotFoundException { 
     List<ApplicationInfo> packages; 
     PackageManager pm; 
     //Init the package manager as pm 
     pm = getPackageManager(); 
     //Get all installed applications 
     packages = pm.getInstalledApplications(0); 
     //Get the ApplicationInfo as packageInfo from each packages 
     for(ApplicationInfo packageInfo:packages) { 
      //Check for a name that matches the packageName 
      if(packageInfo.packageName.equals(packageName)) { 
       //The package exists 
       return packageInfo; 
      } 
     } 
     //The package was not found 
     //Throw an exception 
     throw new PackageNotFoundException("Package not found"); 
    } 

    //Copy a file from an input directory to an output directory 
    public boolean copyFile(String inputPath, String outputPath) throws IOException { 
     //Construct the input and output paths as File objects with respective read/write privileges 
     //File inputFile = new File("/data/data/org.xbmc.xbmc/files/.xbmc/userdata/guisettings.bak"); 
     //File outputFile = new File("/data/data/org.xbmc.xbmc/files/.xbmc/userdata/guisettings.xml"); 
     //File inputFile = getDir(inputPath, MODE_PRIVATE); 
     //File outputFile = getDir(outputPath, MODE_PRIVATE); 
     File inputFile = new File(inputPath); 
     File outputFile = new File(outputPath); 
     //Check if the input and output files exist 
     if(!inputFile.exists()) { 
      return false; 
     } 
     if(!outputFile.exists()) { 
      //Create the output file 
      new File(outputPath); 
     } 
     //Get the input read state 
     boolean canReadInput = inputFile.canRead(); 
     //Get the output write state 
     boolean canWriteOutput = outputFile.canWrite(); 
     //Check if the input file can be read and if the output file can be written 
     if(canReadInput && canWriteOutput) { 
      //Open respective input and output buffer streams 
      InputStream in = new FileInputStream(inputFile); 
      OutputStream out = new FileOutputStream(outputFile); 
      //Create a byte array 
      byte[] buffer = new byte[1024]; 
      //The current position of the byte buffer 
      int bufferPosition; 
      //While the bufferPosition is reading the file 1024 bytes at a time (-1 = no longer reading) 
      while((bufferPosition = in.read(buffer)) != -1) { 
       //Append the current buffer in memory to the output file 
       //With a pointer offset of 0 and a count of the current bufferPosition 
       out.write(buffer, 0, bufferPosition); 
      } 
      //Close the file streams 
      in.close(); 
      out.close(); 
      return true; 
     } 
     return false; 
    } 

    //The Package Error Class 
    private class PackageNotFoundException extends Exception { 
     //If an error is thrown with a message parameter 
     PackageNotFoundException(String m) { 
      //Pass the message to the super Exception class 
      super(m); 
     } 
    } 
} 

回答

0

事實證明,我的android設備有一些問題連接到我的電腦,因此CIP錯誤。

切換到其他設備後,我還發現輸入文件本身沒有找到,因爲我試圖通過「data/data」目錄訪問它。已安裝應用程序的應用程序數據目錄只能通過外部存儲路徑訪問。由於這因設備而異,因此需要動態檢索。

Environment.getExternalStorageDirectory().getAbsolutePath(); 

以這種方式訪問​​文件後,我能夠成功地複製它。