Папка создается как файл

ПУТЕШЕСТВУЕТ: Те, кто проголосовал против вопроса, не могли бы вы добавить несколько комментариев, почему???? Я хочу сказать плохие слова, просто не хочу, чтобы меня забанили.

У меня есть приложение, и я хочу иметь папку на SD-карте, чтобы пользователи могли добавлять некоторые вещи, а затем я мог использовать их внутри приложения. Я использую следующий код для создания папки:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //External storage
        boolean mExternalStorageAvailable = false;
        boolean mExternalStorageWriteable = false;
        String state = Environment.getExternalStorageState();

        if (Environment.MEDIA_MOUNTED.equals(state)) {
            // We can read and write the media
            mExternalStorageAvailable = mExternalStorageWriteable = true;
            Log.v("Storage","ablo to read and write");
            //create Beatss folder
            File direct = new File(android.os.Environment.getExternalStorageDirectory().getPath() + "/Beatss");
            Log.v("Storage",android.os.Environment.getExternalStorageDirectory().getPath() + "/Beatss");
                boolean success = true;
                if (!direct.exists()) {
                    success = direct.mkdirs();

                }
                if (success) {
                    // Do something on success
                    Log.v("Storage","Folder has been created");

                } else {
                    // Do something else on failure 

                }

        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            // We can only read the media
            mExternalStorageAvailable = true;
            mExternalStorageWriteable = false;
            Log.v("Storage","ablo to read only");
        } else {

            mExternalStorageAvailable = mExternalStorageWriteable = false;
            Log.v("Storage","no access");               
        }

Я вижу в DDMS, что папка была создана, но когда я захожу в WindowsExplorer, у меня вместо папки появляется файл. Итак, как создать папку?

UPD1: Итак, даже когда я создаю что-то внутри этой папки, у меня все еще есть файл в проводнике Windows, но внутри DDMS я вижу, что у меня есть папка, а внутри нее другая папка. Так что тут не так??

UPD2: Итак, разбил direct строку в logcat, чтобы посмотреть, есть ли реальный путь:

01-24 21:14:04.368: V/Storage(12116): /mnt/sdcard/Beatss/

Так что есть..

UPD3: Я не могу показать весь свой код, пока что он составляет 264 строки. Создание всей этой папки происходит при onCreate mainActivity. Файл манифеста выглядит так:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="uk.test
android:versionCode="1"
android:versionName="1.0"
android:installLocation="auto" >

<uses-sdk
    android:minSdkVersion="7"
    android:targetSdkVersion="16" />
<supports-screens         
              android:smallScreens= "true"
              android:normalScreens="true"
              android:largeScreens="true"
              android:xlargeScreens="false"                  
/>


    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:screenOrientation="portrait"
    >
    <activity
        android:name=".Main"
        android:label="@string/app_name"
        android:screenOrientation="portrait" 
        android:clearTaskOnLaunch="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="com.google.ads.AdActivity"
              android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>        
    <activity android:name=".MainActivity"
              android:label="@string/app_name"
              android:screenOrientation="portrait">
    </activity>
    <activity android:name=".SupportScreen"
              android:label="@string/app_name"
              android:screenOrientation="portrait">
    </activity>
        <activity android:name="com.tapjoy.TJCOffersWebView" android:configChanges="keyboardHidden|orientation" />
        <activity android:name="com.tapjoy.TapjoyFullScreenAdWebView" android:configChanges="keyboardHidden|orientation" />
        <activity android:name="com.tapjoy.TapjoyDailyRewardAdWebView" android:configChanges="keyboardHidden|orientation" />
        <activity android:name="com.tapjoy.TapjoyVideoView" android:configChanges="keyboardHidden|orientation" />

</application>
</manifest>

Код обновления вверху:

Логкат говорит:

01-24 21:19:21.068: V/Storage(14088): /mnt/sdcard/Beatss/
01-24 21:19:21.138: V/Storage(14088): Folder has been created

person Daler    schedule 24.01.2013    source источник
comment
Что произойдет, если вы создадите файлы внутри этой папки или после этого отметите direct.isDirectory()? ;)   -  person ConcurrentHashMap    schedule 24.01.2013
comment
пока не пробовал... интересно   -  person Daler    schedule 24.01.2013
comment
Просто предупредительное примечание: не ругайте пользователей, которые находят свою SD-карту с дюжиной каталогов по всей SD-карте — сделайте привычкой хранить в /sdcard/Android/my.pkg.name/....., чтобы конечному пользователю было легче очистить, если возникнет такая необходимость. . ;)   -  person t0mm13b    schedule 24.01.2013
comment
да да да, сначала давайте создадим эту папку, а потом подумаем об управлении   -  person Daler    schedule 25.01.2013
comment
Похоже, что проблема похожа на эту -unless-i-force">вопрос.   -  person Angelo    schedule 28.01.2013
comment
Вы должны использовать getExternalStorageDirectory, а затем File file = new File(yourThisDirectory); File file = new File(directory); file.mkdirs(); File outputFile = new File(file, "your file name"); FileOutputStream f = new FileOutputStream(outputFile);   -  person techieWings    schedule 02.02.2013


Ответы (4)


Попробуй

String PATH = Environment.getExternalStorageDirectory()+"/Folder123/";
            File file = new File(PATH);
            file.mkdirs();
person Gabriel Augusto    schedule 24.01.2013
comment
он создает папку, но я не могу ее увидеть через WindowsExplorer. Та же ситуация, что и у меня сейчас, так что не полезно - person Daler; 24.01.2013
comment
Я добавил рабочий код в качестве ответа, в котором использовалась та же техника, что и в комментарии выше. Этот код должен работать, потому что он использует ту же технику, что и рабочий код, который я опубликовал. Имейте в виду, что на устройствах со съемными SD-картами есть две SD-карты. Проводник Windows отобразит два каталога с именами вроде «Устройство» и «Карта». getExternalStorageDirectory() возвращает устройство, а не каталог съемной SD-карты. - person Howard Hodson; 25.01.2013
comment
Спасибо .. у вас есть другой метод? - person Gabriel Augusto; 30.01.2013

Вот фрагмент кода из приложения, которое у меня есть в производстве....

if (spaceAvailable > spaceRequired) {
        databasePath = new File(settingsDatabasePath, GC.APP_DIRECTORY);
        databasePath.mkdirs();
        settingsDatabasePath = databasePath.getPath().toString();
    }

settingsDatabasePath определяется при первой установке приложения. Это может быть внешнее или внутреннее хранилище в зависимости от того, есть ли у устройства внешнее хранилище или нет. Кроме того, до этого фрагмента было определено, что GC.APP_DIRECTORY (строковая константа в классе GC) еще не создана. Кроме того, после этого фрагмента выполняются тесты, чтобы убедиться, что каталог создан, доступен для записи и является каталогом. Базы данных и файлы создаются в каталоге приложения, чтобы не допустить «разбрызгивания» файлов в каталоге корневого уровня.

Примечание: settingsDatabasePath преднамеренно перезаписывается. Если вы скопируете код, вы можете не захотеть перезаписывать.

person Howard Hodson    schedule 24.01.2013
comment
ты вообще половину чего-то поставил, что полезного в этом коде? где начало? Я устал от множества способов создания этой чертовой папки, но вместо папки создается файл. - person Daler; 25.01.2013
comment
Код ключа дублирует код gabrielaugustodm. Использование mkdirs() создает всю строку каталогов. mkdir() создает только последний каталог в существующем дереве каталогов. Оба вернут false, если они потерпят неудачу. Ни один из них не создаст файл. Похоже, ваша проблема заключается в попытке создать каталог с тем же именем, что и у существующего файла, на уровне, которым должен быть каталог. Или вы создаете структуру на несъемной (системной) SD-карте. По сути, я говорю, что процесс file.mkdirs() правильный. У вас проблемы с конфликтами имен или с двумя SD-картами, а не с одной. - person Howard Hodson; 28.01.2013
comment
проблема в том, что все ваши коды, которые вы опубликовали, такие же, как и в моем вопросе. Он создает папку, внутри системы Android вы можете работать с ней без проблем. Я не вижу это как папку внутри WindowsExplorer, и это проблема, а не создание папки. Как заставить его работать как папка - person Daler; 29.01.2013
comment
Итак, вы создаете каталог. Как вы пытаетесь создать файлы в каталоге? - person Howard Hodson; 29.01.2013
comment
Я просто хочу создать пустой набор каталогов, чтобы пользователь заполнил его данными со своих компьютеров. - person Daler; 29.01.2013
comment
Попробуйте удалить все, что вы создали с помощью проводника Windows (новый запуск). После того, как вы сделаете «если успех» и это правда, добавьте тест, чтобы увидеть, является ли это каталогом. Зарегистрируйте результаты. Заходя в первый раз, вы должны получить false для теста exists и true для тестов успеха и isDirectory. Вы пишете код немного иначе, чем я, но я не понимаю, почему он не должен работать при первом запуске. Возможно, вы захотите добавить в код еще несколько операторов журнала и посмотреть, что происходит, более подробно. - person Howard Hodson; 08.02.2013

попробуй это :

String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
    File folder = new File(extStorageDirectory, "DIR_NAME");
    folder.mkdir();
    File file = new File(folder, "Sample.txt");
    try {
        file.createNewFile();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
person Anand    schedule 30.01.2013

В вашем коде нет ничего плохого. Я использую этот же код во всех своих приложениях, и они отлично работают. Я скопировал/вставил ваш код, и он отлично работает. Папка Beats доступна для просмотра на моем компьютере с Windows. У вас ДОЛЖНА быть проблема с вашей SD-картой. Вам либо нужно проверить его на ошибки, либо попробовать другую SD-карту.

В Windows щелкните правой кнопкой мыши SD-карту, затем выберите «Свойства»> «Инструменты»> «Проверка ошибок», затем нажмите «Проверить сейчас». Если ошибок нет, попробуйте другую карту. Если это не так, то попробуйте свой apk на другом устройстве и посмотрите, работает ли он там.

person MrBruce    schedule 31.01.2013
comment
я пробовал в двух телефонах, не работает так.. не флешка. Я должен попробовать его на каком-то другом производителе, возможно, все мои тестовые устройства от Sony. - person Daler; 01.02.2013