Проверка файла

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
skrudjmakdak
Сообщения: 8
Зарегистрирован: 20 авг 2012, 11:52

Проверка файла

Сообщение skrudjmakdak » 26 дек 2013, 21:40

Сразу код:

Код: Выделить всё

...
private final static String file = "config.xml";
...
public static void Create(ContextWrapper contextWrapper)
			throws IOException
	{
	Toast.makeText(contextWrapper, "Создание конфигурационного файла", Toast.LENGTH_LONG).show();
	FileOutputStream fileInputStream = contextWrapper.openFileOutput(file, ContextWrapper.MODE_PRIVATE);
	OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileInputStream);
	BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
	bufferedWriter.write(fileText);
	bufferedWriter.close();
	Log.d("warning", "ok");
	}
...
File config = new File(file);

if (config.isFile())
	Log.d("warning", "файл есть");
else
	{
	Log.d("WARNING", "файла нет!!!!");
	LSettings.Create(contextWrapper);
	}
...
вообщем есть какой то метод, в нем создается объект file. и далее мы проверяем, если он есть, значит мы будет его читать, а есть нет - создадим методом Create..

При первом запуске разумеется его нет и он создается. в логах откладывается "ок".
При втором запуске он снова создается, хотя физически он там есть, смотрю в FileExplorer...

вопрос, почему он его не видит? специально создал консольное приложение, там все нормально. первый раз создает, второй раз игнорирует, файл уже есть....

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Проверка файла

Сообщение KamiSempai » 27 дек 2013, 11:39

При создании файла, обычно указывается не только его название, а еще и полный путь к нему.
Получается вы его в корневую директорию записываете?

И странный у вас способ проверки на существование. Для этого есть специальный метод exists().
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Проверка файла

Сообщение altwin » 27 дек 2013, 12:42

KamiSempai писал(а):При создании файла, обычно указывается не только его название, а еще и полный путь к нему.
Получается вы его в корневую директорию записываете?
путь указывать незачем, файл создается в "/data/data/your_project_package_structure/files/samplefile.txt"., разве нет?(сам не помню)
skrudjmakdak писал(а): Сразу код:
вам могу предложить код:

Код: Выделить всё

private void copyFiles() throws IOException{

        InputStream myInput = myContext.getAssets().open(FILE_NAME_KEPT_IN_ASSET_FOLDER);  //myContext - your application context
        String outFileName = "/data/data/your.package.name/files/";
        OutputStream myOutput = new FileOutputStream(outFileName);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }
вам нужно только создать функцию createFile(), которая в случае наличия файла в пути(/data/data/your.package.name/files/) ничего не делает, а если файла нет вызывает copyFiles().
Изображение

skrudjmakdak
Сообщения: 8
Зарегистрирован: 20 авг 2012, 11:52

Re: Проверка файла

Сообщение skrudjmakdak » 27 дек 2013, 17:05

altwin, если вы заметили, то у меня вопрос как раз про проверку файла и был. файл у меня пишется и пишется то что надо, он у меня физически есть.. но эти методы exists и isFile не работаю почему то должным образом.. может надо другие методы там использовать

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Проверка файла

Сообщение altwin » 27 дек 2013, 17:16

skrudjmakdak писал(а):altwin, если вы заметили, то у меня вопрос как раз про проверку файла и был. файл у меня пишется и пишется то что надо, он у меня физически есть.. но эти методы exists и isFile не работаю почему то должным образом.. может надо другие методы там использовать
Код я привел потому, что он работает и не понял, как вы делаете операцию копирования, меня смутило название переменной типа FileOutputStream именем fileInputStream, я понял что все равно будет запутанно и не пойму. То, что у вас была запись в лог - Ок говорит лишь о том, что отработал блок кода, но никак не о том, что файл создан(для этого есть try/catch). И вашего кода видно что вы выполняете проверку и она должна работать, если нет - файл не создан - он есть в устройстве? Вы уверенны, что файл открылся? Что он был зачитан и записан? Используйте try/catch при операциях с файлами и будет понятно в чем ошибка, если она есть.
Изображение

skrudjmakdak
Сообщения: 8
Зарегистрирован: 20 авг 2012, 11:52

Re: Проверка файла

Сообщение skrudjmakdak » 27 дек 2013, 17:36

altwin, да, сори.. с переменной протупил (fileInputStream). признал ошибку...

я вместо try catch использую throws и если в лог не высветится "ок", то в любом случае будет исключение. если "ок" есть, то исключения небыло, значит файл создан.
Повторюсь, файл !!!создан!!! смотрю в FileExplorer. скажу больше, я его просматривал содержимое, его содержимое то что надо..
вот сейчас я прописал полный путь:

Код: Выделить всё

File config = new File("data/data/com.example.testandroid/files/" + file);
Log.d(warning, Boolean.toString(config.isFile()));
и он его увидел. если этого не делать, то он его не видит..

если подскажите где найти метод указывающий текущую директорию (или директорию рабочей программы, не знаю как правильно выразится), то... было бы верри гуд))

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Проверка файла

Сообщение altwin » 27 дек 2013, 17:41

попробуйте

Код: Выделить всё

String path = Environment.getExternalStorageDirectory().toString();
я бы советовал и создавать файл так

Код: Выделить всё

File file = new File(Environment.getExternalStorageDirectory(), YOUR_FILE);
по идее найти папку можно и так:

Код: Выделить всё

PackageManager m = getPackageManager();
String s = getPackageName();
PackageInfo p = m.getPackageInfo(s, 0);
s = p.applicationInfo.dataDir;
а этот пример возвращает субдиректорию dataDir:

Код: Выделить всё

String appPath = App.getApp().getApplicationContext().getFilesDir().getAbsolutePath();
а чтобы не парить себе мозг - просто пропишите в path = "data/data/com.example.testandroid/files/", и используйте переменную для проверки т.е. path+"filename". Должно работать.

Или для текущего приложения:

Код: Выделить всё

public String getDataDir(Context context) throws Exception 
{
    return context.getPackageManager().getPackageInfo(getPackageName(), 0).applicationInfo.dataDir;
}
И для любого:

Код: Выделить всё

public String getAnyDataDir(Context context, String packageName) throws Exception 
{
    return context.getPackageManager().getPackageInfo(packageName, 0).applicationInfo.dataDir;
}
а вообще тут http://developer.android.com/reference/ ... tionInfo(), говорят, что проще всего:

Код: Выделить всё

getApplicationInfo().dataDir
Последний раз редактировалось altwin 27 дек 2013, 18:01, всего редактировалось 4 раза.
Изображение

skrudjmakdak
Сообщения: 8
Зарегистрирован: 20 авг 2012, 11:52

Re: Проверка файла

Сообщение skrudjmakdak » 27 дек 2013, 17:55

altwin, смотрите, прописал так:

Код: Выделить всё

File config = new File(Environment.getExternalStorageDirectory(),file);
Log.d(warning, config.toString());
в лог вывалило:
/mnt/sdcard/config.xml

не совсем то))

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Проверка файла

Сообщение altwin » 27 дек 2013, 17:57

skrudjmakdak писал(а):altwin, смотрите, прописал так:

Код: Выделить всё

File config = new File(Environment.getExternalStorageDirectory(),file);
Log.d(warning, config.toString());
в лог вывалило:
/mnt/sdcard/config.xml

не совсем то))
ну значит у вас External стоит SD кард, я менял настройки )) делайте тоже но Internal storage(там idea должна выдать точный метод), либо еще примеры выше я дописал. По идее ну записали на карту и что? даже лучше ))) просто проверяйте:

Код: Выделить всё

String fileExists = Environment.getExternalStorageDirectory().toString + "/YourFilename";
if(fileExists.exists() || fileExists.isFile() ){}
Последний раз редактировалось altwin 27 дек 2013, 18:43, всего редактировалось 1 раз.
Изображение

skrudjmakdak
Сообщения: 8
Зарегистрирован: 20 авг 2012, 11:52

Re: Проверка файла

Сообщение skrudjmakdak » 27 дек 2013, 17:59

я отлучусь, позже отпишусь.. спс за помощь)

skrudjmakdak
Сообщения: 8
Зарегистрирован: 20 авг 2012, 11:52

Re: Проверка файла

Сообщение skrudjmakdak » 27 дек 2013, 19:26

вот это работает:
altwin писал(а): Или для текущего приложения:

Код: Выделить всё

public String getDataDir(Context context) throws Exception 
{
    return context.getPackageManager().getPackageInfo(getPackageName(), 0).applicationInfo.dataDir;
}
как вариант тож подойдет)):
altwin писал(а):а чтобы не парить себе мозг - просто пропишите в path = "data/data/com.example.testandroid/files/", и используйте переменную для проверки т.е. path+"filename". Должно работать.
еще раз спасибо, подмогли..

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Проверка файла

Сообщение altwin » 29 дек 2013, 14:08

Кстати, что очень удобно, в Android есть "родные" методы работы с файлами - openFileInput/openFileOutput, которые по умолчанию кладут файл в нужное место(если конечно настройки по умолчанию подходят), а к примеру метод fileList объекта Context - возвращает список файлов приложения, что удобно для проверок. Ну а если используется статический файл(изменять который не предполагается из приложения), копировать его вообще незачем, буквально вчера я нашел для себя очень удобным хранить его в res/raw. Доступ к нему получить очень просто:
[syntax=java]
Resources res = getResources();
InputStream file = res.openRawResource(R.raw.filename);
[/syntax]
P.S. собственно решил дописать сюда, мало ли - забуду, будет где подсмотреть :)
Изображение

Ответить