Страница 1 из 1

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

Добавлено: 26 дек 2013, 21:40
skrudjmakdak
Сразу код:

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

...
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...

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

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

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

И странный у вас способ проверки на существование. Для этого есть специальный метод exists().

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

Добавлено: 27 дек 2013, 12:42
altwin
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().

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

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

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

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

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

Добавлено: 27 дек 2013, 17:36
skrudjmakdak
altwin, да, сори.. с переменной протупил (fileInputStream). признал ошибку...

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

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

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

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

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

Добавлено: 27 дек 2013, 17:41
altwin
попробуйте

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

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

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

Добавлено: 27 дек 2013, 17:55
skrudjmakdak
altwin, смотрите, прописал так:

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

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

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

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

Добавлено: 27 дек 2013, 17:57
altwin
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() ){}

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

Добавлено: 27 дек 2013, 17:59
skrudjmakdak
я отлучусь, позже отпишусь.. спс за помощь)

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

Добавлено: 27 дек 2013, 19:26
skrudjmakdak
вот это работает:
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". Должно работать.
еще раз спасибо, подмогли..

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

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