2014-09-04 123 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(); 

以这种方式访问​​文件后,我能够成功地复制它。