Исключение FileNotFoundException на SD-карте Android

#android #file-io

#Android #ввод-вывод файла

Вопрос:

Я экспортирую файл на SD-карту, однако я сталкиваюсь с исключением FileNotFound ( 04-12 01:26:18.494: DEBUG/Carburant(4568): /mnt/sdcard/Carburant/alaa.peugeot.settings.dat/alaa.peugeot.settings.dat (Is a directory) ) вот код:

 try {
    File sdCard = Environment.getExternalStorageDirectory();
    boolean mExternalStorageAvailable = false;
    boolean mExternalStorageWriteable = false;
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        // We can read and write the media
        Log.d("Carburant", "Sdcard can read/write !!");
        mExternalStorageAvailable = mExternalStorageWriteable = true;
        try {
            final SharedPreferences preferences = PreferenceManager
                    .getDefaultSharedPreferences(context);
            String fileName = context.getResources().getString(
                R.string.fileName);
            String fileDir = ""   preferences.getString("login", "")
                  "."   preferences.getString("marque", "")   ".";
            File f2 = new File(context.getFilesDir(), fileDir
                  fileName);
            String y = f2.getAbsolutePath();
            Log.d("HI Export", y);
            InputStream in = new FileInputStream(f2);
            File dir = new File(sdCard.getAbsolutePath()
                  "/Carburant/");
            String x = dir.getAbsolutePath();
            Log.d("HI", x);
            File file = new File(dir, fileDir   fileName);
            file.mkdirs();
            OutputStream out = new FileOutputStream(file);
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) != -1) {
                out.write(buf, 0, len);
            }
            // out.flush();
            in.close();
            out.close();
            Toast.makeText(context, "Export effectué",
                Toast.LENGTH_SHORT).show();
        } catch (FileNotFoundException ex) {
            Toast.makeText(context, "File Not found",
                Toast.LENGTH_SHORT).show();
            String x = ex.getMessage();
            Log.d("Carburant", x);
        } catch (IOException e) {
            Toast.makeText(context, "Echec", Toast.LENGTH_SHORT).show();
        }
    }
    // copyfile(nom,file.getAbsolutePath());
    else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        // We can only read the media
        Log.d("Carburant", "Sdcard only read !!");
        mExternalStorageAvailable = true;
        mExternalStorageWriteable = false;
    } else {
        // Something else is wrong. It may be one of many other states,
        // but all we need
        // to know is we can neither read nor write
        mExternalStorageAvailable = mExternalStorageWriteable = false;
    }
} catch (Exception e) {
    Log.d("CARBURANT", e.getMessage());
}
  

Хотите экспортировать файл из /data/data/<package name>/fileDir fileName в каталог, сохраняемый на sdcard.

Комментарии:

1. Ваша конкатенация путей выглядит подозрительно. Я предлагаю подключить несколько волшебных строк и посмотреть, устраняет ли это проблему. При объединении имен файлов и каталогов я предлагаю обрезать все символы косой черты в начале и конце второго и первого сегментов соответственно и повторно вставить косую черту между ними. Очевидно, что это не будет обрабатывать «..», «~» или «.», что вы также можете рассмотреть.

2. @Computer Linguist: Нет, с «.» проблем нет, потому что я использовал этот файл в других классах / действиях, и никаких проблем не возникло. В пути создания абсолютно ошибка. :

3. Я не думаю, что сообщение могло быть более четким : /mnt/sdcard/Carburant/alaa.peugeot.settings.dat/alaa.peugeot.settings.dat (Is a directory) . Измените File file = new File(dir, fileDir fileName); file.mkdirs(); на File file = new File(dir, fileDir); file.mkdirs(); file = new File(file, fileName); . При этом ваш код в беспорядке — используйте finally и не используйте 1000 переменных

4. @Shog9: вам следует повторно открыть, вообще не слишком локализовано

Ответ №1:

 File file = new File(dir, fileDir fileName);
file.mkdirs();
  

Я думаю, что вы по ошибке создали каталог с именем /mnt/sdcard/Carburant/alaa.peugeot.settings.dat/alaa.peugeot.settings.dat , и теперь код не может перезаписать его?

Комментарии:

1. Я удалил fileName fileDir в этой строке : File dir = новый файл (sdCard.getAbsolutePath() «/Carburant/»); (см. 1-й пост) и всегда одна и та же проблема: ( .

2. @@Preet Sangha: сделал это:File file = новый файл(sdCard.getAbsolutePath(), fileDir fileName); file.mkdirs(); та же проблема!