Android studio file lastmodified

Файл lastModified () метод в Java с примерами

Функция lastModified () является частью класса File в Java. Эта функция возвращает время, обозначенное этим абстрактным путем, в последний раз измененное. Функция возвращает длинное значение, измеренное в миллисекундах, представляющее время, когда файл был изменен в последний раз, в противном случае возвращает 0L, если файл не существует или возникает исключение.

Подпись функции:

Синтаксис:

Параметры: Этот метод не принимает никаких параметров.

Возвращаемый тип Эта функция возвращает длинный тип данных, представляющий время последнего изменения файла, или 0L, если файл не существует.

Исключение: этот метод генерирует исключение безопасности, если доступ на запись в файл запрещен

Ниже программы иллюстрируют использование функции lastModified ():

Пример 1. Файл «F: //program.txt» является существующим файлом в F: Directory.

// Java-программа для демонстрации
// lastModified () метод класса файла

public class solution <

public static void main(String args[])

File f = new File( «F:\\program.txt» );

// Получить время последнего изменения файла

System.out.println( «Last modified: «

Выход:

Пример 2: файл «F: //program1.txt» не существует

// Java-программа для демонстрации
// lastModified () метод класса файла

public class solution <

public static void main(String args[])

File f = new File( «F:\\program.txt» );

// Получить время последнего изменения файла

System.out.println( «Last modified: «

Выход:

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

Источник

Класс File

В отличие от большинства классов ввода/вывода, класс File работает не с потоками, а непосредственно с файлами. Данный класс позволяет получить информацию о файле: права доступа, время и дата создания, путь к каталогу. А также осуществлять навигацию по иерархиям подкаталогов.

Класс java.io.File может представлять имя определённого файла, а также имена группы файлов, находящихся в каталоге. Если класс представляет каталог, то его метод list() возвращает массив строк с именами всех файлов.

Для создания объектов класса File можно использовать один из следующих конструкторов.

  • File(File dir, String name) — указывается объекта класса File (каталог) и имя файла
  • File(String path) — указывается путь к файлу без указания имени файла
  • File(String dirPath, Sring name) — указывается путь к файлу и имя файла
  • File(URI uri) — указывается объекта URI, описывающий файл

Методы класса File

Класс File может использоваться для создания каталога или дерева каталогов. Также можно узнать свойства файлов (размер, дату последнего изменения, режим чтения/записи), определить к какому типу (файл или каталог) относится объект File, удалить файл. У класса очень много методов, перечислим некоторые.

  • getAbsolutePath() — абсолютный путь файла, начиная с корня системы. В Android корневым элементом является символ слеша (/)
  • canRead() — доступно для чтения
  • canWrite() — доступно для записи
  • exists() — файл существует или нет
  • getName() — возвращает имя файла
  • getParent() — возвращает имя родительского каталога
  • getPath() — путь
  • lastModified() — дата последнего изменения
  • isFile() — объект является файлом, а не каталогом
  • isDirectory — объект является каталогом
  • isAbsolute() — возвращает true, если файл имеет абсолютный путь
  • renameTo(File newPath) — переименовывает файл. В параметре указывается имя нового имени файла. Если переименование прошло неудачно, то возвращается false
  • delete() — удаляет файл. Также можно удалить пустой каталог
Читайте также:  Синхронизация контактов android с контактами windows

Каталог

Каталог — это объект класса File, который содержит список других файлов и каталогов. После создания объекта класса File, являющего каталогом, его метод isDirectory() вернёт значение true. И тогда вы можете вызывать метод list().

Для создания каталога можно использовать метод mkdir(), который вернёт true в успешном случае. Если указанный путь уже существует или каталог нельзя создать из-за отсутствия полного пути к нему, то вернётся false.

Метод mkdirs() создаёт сам каталог, так и всех его родителей.

Список каталогов

Если вы хотите получить содержимое каталога, то можно вызвать метод list() без аргументов. Вам вернётся полный список (массив) имён файлов и каталогов, содержащихся в данном каталоге. Есть ещё похожий метод listFiles(), который возвращает массив файлов (объектов, а не их имён), о котором поговорим отдельно.

Если вам нужен только список файлов с расширением .java, то можно использовать специальный фильтр-класс, который описывает критерии отбора объектов File с помощью интерфейса FilenameFilter.

Интерфейс FilenameFilter определяет единственный метод accept(), вызываемый по одному разу с каждым файлом в списке.

Метод возвращает true для файлов каталога, указанного в dir, которые должны быть включены в список, и false — для файлов, которые следует исключить.

Метод listFiles()

Метод имеет несколько перегруженных версий. Он возвращает список файлов в виде массива объектов класса File. Одна из версий метода также использует интерфейс FilenameFilter. Другая версия использует интерфейс FileFilter и возвращает те файлы, путевые имена которых соответствует интерфейсу.

Пример использования методов класса File показан в уроке Файловый менеджер и в других примерах.

Источник

Создание удобного OpenFileDialog для Android

Наверное, как и многие разработчики под Android, столкнулся на днях с необходимостью реализовать в своем приложении выбор файла пользователем. Так как изначально в Android такого функционала нет, обратился к великому и ужасному. Это показалось мне странным, но из вороха вопросов на stackoverflow и небольшого числа отечественных форумов можно выделить всего три основных источника:

  1. Android File Dialog – почти все ссылки из stackoverflow ведут сюда. В принципе, неплохое решение, но реализовано через отдельную activity, а хотелось чего-то в духе OpenFileDialog’а из .Net.
  2. В данной статье речь идет вообще об отдельном файл-менеджере, и почерпнуть какие-то идеи из неё не удалось.
  3. Идея же отсюда очень понравилась, однако, как мне показалось реализовать все это можно несколько красивее.

В результате, начав реализовывать своё решение, я столкнулся с некоторыми трудностями решать которые показалось очень интересно. А посему, решил описать в данной статье не просто готовое решение, а все шаги, которые к нему привели. Желающие пройти их вместе –
Итак, приступим! В любой привычной среде (я использую IntelliJ IDEA) создадим новое приложение. На главной activity расположим одну единственную кнопку и напишем к ней, пока пустой, обработчик нажатия:

Создадим новый класс с конструктором:

Читайте также:  Как стать хакером с андроида

а в обработчике кнопки вызовем диалог:

Кнопки показались, теперь надо бы и сами файлы найти. Начнем поиск с корня sdcard, для чего определим поле:

и реализуем следующий метод:

(так как главное требование к классу – работать сразу у любого разработчика, без подключения дополнительных библиотек, — то никаких google-collections использовать не будем, и с массивами приходится работать по старинке), а в конструкторе к вызову setNegativeButton добавим .setItems(getFiles(currentPath), null).

Что же, неплохо, однако файлы не отсортированы. Реализуем для этого дела Adapter как внутренний класс, заменим setItems на setAdapter и немного перепишем getFiles:

Еще лучше, но нам надо по клику на папке идти внутрь. Можно достучаться до встроенного listview, но я просто подменил его собственным (это потом пригодится). Плюс, изменения adapter’а внутри обработчика listview вызывало exception, и список файлов пришлось вынести в отдельное поле:

Отлично, вот только нажав на папку Android мы получаем список всего из одного каталога data, и наше окно тут же уменьшается в размере.

Возможно это нормально, но мне это не понравилось, и я стал искать возможности размер сохранить. Единственный найденный мною вариант – это установка setMinimumHeight. Установка этого свойства для listview вызвала дополнительные проблемы, но они решились оберткой его в LinearLayout:

Результат, все равно получился немного не таким, каким хотелось бы: при старте диалог развернут на весь экран, а после перехода в каталог Android – уменьшается до 750px. Да еще и экраны разных устройств имеют разную высоту. Решим сразу обе этих проблемы, установив setMinimumHeight в максимально возможную для текущего экрана:

Не нужно пугаться того, что мы устанавливаем в setMinimumHeight полный размер экрана, сама система уменьшит значение до максимально допустимого.
Теперь появляется проблема понимания пользователя, в каком каталоге он сейчас находится, и возврата вверх. Давайте разберемся с первой. Вроде все легко — установить значение title в currentPath и менять его при изменении последнего. Добавим в конструктор и в метод RebuildFiles вызов setTitle(currentPath).

А нет – заголовок не изменился. Почему не срабатывает setTitle после показа диалога, документация молчит. Однако мы может это исправить, создав свой заголовок и подменив им стандартный:

И снова не все ладно: если пройти достаточно далеко, то строка в заголовок влезать не будет

Решение с установкой setMaximumWidth не верно, так как пользователь будет видеть только начало длинного пути. Не знаю, насколько верно мое решение, но я сделал так:

Решим теперь проблему с возвратом. Это достаточно легко, учитывая, что у нас есть LinearLayout. Добавим в него еще один TextView и немного отрефракторим код:

Возможность возвращаться на шаг вверх, может привести пользователя в каталоги, к которым ему доступ запрещен, поэтому изменим функцию RebuildFiles:

(cообщение пока не очень информативное, но вскоре мы добавим разработчику возможность исправить это).
Ни один OpenFileDialog не обходится без фильтра. Добавим и его:

Обратите внимание — фильтр принимает регулярное выражение. Казалось бы – все хорошо, но первая выборка файлов сработает в конструкторе, до присвоения фильтра. Перенесем её в переопределенный метод show:

Осталось совсем чуть-чуть: вернуть выбранный файл. Опять же, я так и не понял зачем нужно устанавливать CHOICE_MODE_SINGLE, а потом все равно писать лишний код для подсветки выбранного элемента, когда он (код) и так будет работать без CHOICE_MODE_SINGLE, а потому обойдемся без него:

Читайте также:  Root права android для asus

Источник

File.lastModified () никогда не был установлен с file.setLastModified ()

У меня проблема с набором миллисов и читается на Android 2.3.4 на Nexus One. Это код:

В этом небольшом тесте я пишу 1310198774, но результат, который возвращается из lastModified (), равен 1310199771000.

Даже если я сокращаю конечный «000», разница составляет несколько минут.

Мне нужно синхронизировать файлы между веб-сервисом и устройством Android. Минуты последней модификации являются частью данных, отправленных этой службой. Я устанавливаю миллионы для созданных / скопированных файлов и папок, чтобы проверить, нужно ли перезаписывать файл / папку.

Все работает, но миллионы, которые возвращаются из файловой системы, отличаются от значений, которые были установлены.

Я почти уверен, что что-то не так с моим кодом, но я не могу его найти.

Спасибо заранее. HJW

Так что, возможно, я что-то пропустил, но вижу некоторые проблемы с вашим кодом выше. Ваша конкретная проблема может быть вызвана (как указано в @JB) на проблемы с Android, но для потомков я думал, что дам ответ.

Во-первых, File.setLastModified() занимает время в миллисекундах. Вот javadocs . Кажется, вы пытаетесь установить его за считанные секунды. Таким образом, ваш код должен выглядеть примерно так:

Как упоминалось в javadocs, многие файловые системы поддерживают только секундную детализацию секунд для последнего времени модификации. Поэтому, если вам нужно увидеть такое же время модификации в файле, вы должны сделать что-то вроде следующего:

На Jelly Bean + он отличается (в основном, на устройствах Nexus еще и другими, которые используют новый слой плавкого предохранителя для эмуляции эмуляции / mnt / shell / emulated sdcard):

Это проблема разрешения VFS, syscall utimensat () терпит неудачу с EPERM из-за несоответствующих разрешений (например, права собственности).

В платформе / system / core / sdcard / sdcard.c:

/ * Все файлы, принадлежащие root.sdcard * /
Attr-> uid = 0;
Attr-> gid = AID_SDCARD_RW;

Из страницы syscall man utimensat ():

Old FAT предлагает переопределить флаг iattr-> valid с помощью опции mount, чтобы разрешить изменение временных меток кому-либо, FUSE + Android sdcard-FUSE не делает этого в данный момент (поэтому сбой inode_change_ok () завершается с ошибкой) и попытка Отклоняется с -EPERM. Вот FAT ./fs/fat/file.c:

Я также добавил эту информацию к этой открытой ошибке .

Если это не работает, попробуйте это (уродливое) обходное решение, указанное на https://code.google.com/p/android/issues/detail?id=18624 :

Работает на некоторых устройствах, но не на других. Не разрабатывайте решение, основанное на его работе. См. https://code.google.com/p/android/issues/detail?id=18624#c29.

Вот простой тест, чтобы узнать, работает ли он.

Если вы хотите изменить дату / время каталога на текущую дату / время (т. Е. «Сейчас»), вы можете создать в нем какой-то временный файл, записать в него что-то, а затем сразу же удалить его. Это приводит к изменению даты / времени ‘lastModified ()’ каталога до текущей даты / времени. Однако это не сработает, если вы хотите изменить дату / время каталога на какое-либо другое случайное значение и не можете быть применены к файлу, очевидно.

Источник

Оцените статью