Архив

Записи, помеченные ‘files’

30 дней с Apple iPad, День 15: работаем с файлами

У iPad забавная система хранения файлов и странная политика обмена ими с другими устройствами, особенно, если это не устройство фирмы Apple.

>>>>>>>>>>>>>>>>>>>>>>>
Для того, чтобы iPad был основным компьютером, он должен уметь работать с файлами. Мне нужно создавать, сохранять файлы, копировать их с других устройств, печатать и отправлять вложениями по почте. Однако, у айпэда нет привычной системы хранения данных в виде файлов и папок, поэтому для сегодняшнего выпуска «30 дней с iPad» я собираюсь разобраться, как работать с файлами на айпэде.

Когда я работал с Ubuntu Linux в предыдущие «30 дней», потребовалось время, чтобы привыкнуть к отсутствию (или бесполезности) расширений файлов, но всё же файлы и папки находились в своей традиционной иерархии.

Мне кажется, Тони сейчас «говорить говно». Да, в NIX-системах файлы обрабатывают по содержимому. Хотя я лично уже не знаю, как это делается именно в Ubuntu. Исполняемые файлы живут без расширений, это так, у них есть флаг, разрешающий выполнение. Но для пользователя и в винде, и в убунте расширений давно не видно: и там, и там картинки, только олдфаги, вроде меня, предпочитают включать отображение расширений. (Здесь и далее комментарии jackyfox’a)

iPad смотрит на файлы, как на неизбежное зло. В нем есть механизмы для разрешения приложениям работать с файлами, но большинство их них похожи скорее на обходные пути, которые добавили в последний момент, когда они в первый раз запустили iPad и сказали: «Прикольно, а где мне хранить файлы и как получить к ним доступ?».

Можно обмениваться файлами между приложениями через iTunes, подключив iPad к компьютеру.

Синхронизация файлов через iTunes

Родной метод iOS для работы с файлами заключается в сортировке их по приложениям и синхронизация через iTunes. Когда iPad подключен к компьютеру, я могу щелкнуть по вкладке «Приложения» и увидеть список приложений, которые могут предоставлять доступ к файлам. Потом я могу добавить файлы к каждому приложению.

Проблема в том, что каждое приложение — это как изолированный островок, и если есть файл, который я хочу использовать в DocsToDo, и, может быть, в Pages, а то еще и в Epson iPrint, мне придется добавить файл ко всем этим приложениям. Похоже, было бы эффективнее иметь одно централизованное файловое хранилище на айпэде, куда можно скопировать файлы, а любое приложение могло бы получить доступ к ним и работать совместно с одной копией вместо отдельных файлов для каждого.

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

У GoFlex Satellite есть точка доступа wi-fi и приложение для iPad для доступа к данным.

Беспроводные диски

Я решил разобраться с использованием внешних накопителей. Это еще одна область, где iPad не может просто взять и начать работать со стандартными инструментами и устройствами хранения данных, которые есть у многих людей. Если немного обработать напильником, то можно заставить iPad работать с USB дисками и SD карточками, но применение этих методов ограничено или требует взлома операционный системы. Кроме того, возможность подключения таких устройств не делает iPad удобнее при работе с файлами на них.

Вышло новое поколение внешний дисков с точками доступа wi-fi, с беспроводным доступом к данным. Диски, вроде Kingston Wi-Drive и Seagate GoFlex Satellite, разработаны специально для хранения и обмена данными с iOS устройствами.

У меня есть терабайтовый винт от Iomega, подключенный к беспроводному роутеру от Linksys, и к нему можно подключиться с любого домашнего компьютера. На этом винте мы храним бекапы и общую семейную коллекцию музыки.

К сожалению, я не нашел способа заставить айпэд «увидеть» этот винт, но даже если бы это получилось, iPad всё равно не знает как получить доступ к файлам. Так что я купил GoFlex Satellite вместо нынешнего винта.

Честно говоря, с 64 гиговым айпэдом мне не очень-то и нужны дополнительные 500 гигов для ежедневного использования. У меня много музыки и несколько фильмов в HD качестве хранятся на айпэде, а большего мне и не надо вне дома. Но если у меня будет только iPad в посткомпьютерную эпоху, такой винт может пригодиться, так как хранилище файлов будет разрастаться со временем. Читать далее…

Метки: , ,

Прогресс копирования файла (CopyFileEx и ProgressBar)

29 ноября 2010 Нет комментариев

При копировании объемных файлов функцией CopyFileEx() [1] возможно сообщать пользователю о прогрессе выполнения операции, при помощи callback-функции (обратного вызова). Например, посредством прогрессбара (полоски загрузки).

Помимо вызова функции CopyFileEx() необходимо написать реализацию колбэк-функции. Допустим, что на форме Form1 у нас есть компонент ProgressBar1, в котором мы и планируем отображать прогресс копирования, тогда реализация выглядит следующим образом:

DWORD CALLBACK ProgressRoutine(
    LARGE_INTEGER TotalFileSize,
    LARGE_INTEGER TotalBytesTransferred,
    LARGE_INTEGER StreamSize,
    LARGE_INTEGER StreamBytesTransferred,
    DWORD dwStreamNumber,
    DWORD dwCallbackReason,
    HANDLE hSourceFile,
    HANDLE hDestinationFile,
    LPVOID lpData
)
{
    // изменяем тукущую позицию
    Form1->ProgressBar1->Position =
        Form1->ProgressBar1->Max * TotalBytesTransferred.QuadPart 
            / TotalFileSize.QuadPart;
    return PROGRESS_CONTINUE;
}

Теперь при вызове функции CopyFileEx() нам достаточно лишь передать ей имя колбэк-функции.

// здесь храним пути к исходному файлу и месту назначения копирования
const char *FileFrom = ("c:\\somewhere\\file.txt").c_str();
const char *FileTo   = ("\\server\\pub\\pepyaka.ololo").c_str();
 
// включаем обработку сообщений для того, чтобы видеть изменения прогрессбара
Application->ProcessMessages();
 
// копируем с флагом защиты от перезаписи
bool copied = CopyFileEx(FileFrom, FileTo, ProgressRoutine,
    NULL, 0, COPY_FILE_FAIL_IF_EXISTS);
 
// по значению переменной copied можно судить об успехе операции
if (copied == true) ShowMessage("Всё отменно скопировалось");

При возникновении ошибок поможет функция GetLastError() [2], которая вернет код подседней ошибки WINAPI. Значение кода поможет понять этот список.

Метки: , , ,

Получить имена файлов в папке

Сканировать определенную папку и получить имена всех или определенных файлов вам позволит следующий код:

int ires;
TSearchRec SR;
AnsiString ext; // Расширение.
 
// Очищаем список файлов в компоненте ListBox
List->Clear();
// Задаем параметры поиска: где искать и что.
ires = FindFirst("C:\\*.*", faAnyFile | faArchive, SR);
while (ires == 0)
{
    // Если нужны только определенные типы файлов,
    // то ведем проверку по расширению.
    ext = ExtractFileExt(SR.Name);
    if ((ext == ".bmp") || (ext == ".jpg")) {
        // Заносим имена файлов в список.
        List->Items->Add(SR.Name);
    }
    // Переход к следующему файлу к каталоге.
    ires = FindNext(SR);
}
// Поиск завершен.
FindClose(SR);

Основан на функциях Find.

int FindFirst (AnsiString Path, int Attr, TSearchRec & F);

Находит первый файл с заданными атрибутами в указанном каталоге.
Атрибуты передаются с помощью следующих констант: faReadOnly, faHidden, faSysFile, faVolumeID, faDirectory, faArchive.

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

Метки: , ,