代码之家  ›  专栏  ›  技术社区  ›  cjsimon

Android文件复制:路径错误

  •  0
  • cjsimon  · 技术社区  · 11 年前

    我一直试图将文件从一个位置复制到另一个位置。据我了解,我的程序的复制机制工作正常,但当我运行应用程序时,我经常会遇到文件路径错误。我碰巧在xbmc应用程序中处理数据文件。

    资产管理器-->addDefaultAssets CIP路径不存在 /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);
            }
        }
    }
    
    1 回复  |  直到 11 年前
        1
  •  0
  •   cjsimon    11 年前

    事实证明,我的android设备连接到我的计算机时出现了一些问题,因此出现了CIP错误。

    切换到另一个设备后,我还发现输入文件本身没有找到,因为我试图通过“data/data”目录访问它。已安装应用的应用数据目录只能通过外部存储路径访问。由于这因设备而异,因此需要动态检索。

    Environment.getExternalStorageDirectory().getAbsolutePath();
    

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