5763

Работа с файловой системой

Реферат

Информатика, кибернетика и программирование

Работа с файловой системой Файловые системы делятся на несколько типов, в каждой из которых используются одни и те же методы обращения и работы с файлами, дисками и папками. Ниже приведены некоторые типы файловых систем: FAT - самая старая и знакома...

Русский

2012-12-19

124.5 KB

29 чел.

Работа с файловой системой

Файловые системы делятся на несколько типов, в каждой из которых используются одни и те же методы обращения и работы с файлами, дисками и папками. Ниже приведены некоторые типы файловых систем:

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

FAT32 - файловая система, чаще всего используемая в Windows 98, ME и 2000. Является усовершенствованной по сравнению с FAT. Имеет меньшие размеры кластеров, тем самым позволяя более удобно и эффективно расходовать пространство жесткого диска.

HPFS - (high performance file system) эта файловая система была создана специально под операционную систему OS/2 и стала попыткой решить все проблемы, которые возникали с FAT, но она так и не оправдала надежд.

NTFS - очередная попытка исправить ошибки, связанные с FAT, и, по большинству параметров, удачная. Впервые она начала использоваться с Windows NT для сетевых целей. Главной отличительной чертой ее является обеспечение надежности и безопасности. В документации по Windows XP рекомендуют использовать именно эту файловую систему.

CDFS - файловая система, специально созданная для работы с CD-ROM-дисками.

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

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

В Windows предусмотрено два типа работы с файлами: синхронный и асинхронный. Для изучения мы возьмем первый, так как асинхронный применяется редко (удобен для работы с внешними портами компьютеров COM, LPT и т.д.) и в некоторых версиях операционных систем не поддерживается.

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

Типичный файл представляет собой набор данных, хранящийся в такой энергозависимой среде, как магнитный диск. Файлы организованы в файловую систему, которая реализует конкретную схему хранения на физическом носителе и представления различных атрибутов файла – имени, разрешения и информации о владельце.

Функции ядра Windows

В отличие способов управления памятью, где для простых приложений рекомендуется использовать библиотечные функции C/C++, для работы с файлами лучше всего использовать не функции библиотек C/C++, функции интерфейса Win32 API.

Применение функций Win32 API дает два огромных плюса - скорость дискового обмена данными и переносимость программ на другие платформы, использующие интерфейс программирования Win32, среди которых PowerPC, Alpha и MIPS. Тем более что уже ходят слухи о переносе Win32 в среду Unix. Исходя из этих соображений, давайте изучим именно 32-разрядные функции работы с файлами (хотя можно по-прежнему пользоваться и функция библиотеки С).

CopyFile

Функция копирует файл в новое место.

Существует в: Win16, Win32, Win NT

объявлена в winbase.h

 BOOL CopyFile(

  LPCTSTR lpExistingFileName, // Указатель на файл, который надо копировать

  LPCTSTR lpNewFileName, // Указатель на имя файла, куда надо копировать

  BOOL bFailIfExists   // Что делать если файл уже существует.

  );

CreateDirectory

Функция создаёт новую директорию.

Существует в: Win16, Win32, Win NT

объявлена в winbase.h.

  BOOL CreateDirectory(

   LPCTSTR lpPathName, // Указатель на строку содержащую путь к новой директории

   LPSECURITY_ATTRIBUTES lpSecurityAttributes  // Указатель на атрибуты

  );

CreateDirectoryEx

Расширенная функция для создания новой директории. При создании используется указанный шаблон.

Существует в: Win16, Win32, Win NT

объявлена в winbase.h.

Объявление:

  BOOL CreateDirectoryEx(

   LPCTSTR lpTemplateDirectory,// Указатель на директорию-шаблон

   LPCTSTR lpPathName, // Указатель на строку содержащую путь к новой директории

   LPSECURITY_ATTRIBUTES lpSecurityAttributes  // Указатель на атрибуты

  );

CreateFile

Функция создаёт указатель на новое устройство типа:

  •  Файл
  •  Канал
  •  mailslot (почтовый канал)
  •  комуникационный ресурс (например COM порт)
  •  дисковые устройства (только для Windows NT)
  •  консоли
  •  директории (открывает их)

Функция умеет открывать и создавать новые устройства (файлы).

Существует в: Win16, Win32, Win NT

объявлена в winbase.h.

Объявление:

  HANDLE CreateFile(

   LPCTSTR lpFileName,     // Указатель на имя файла (устройства)

   DWORD dwDesiredAccess,  //Параметры доступа

   DWORD dwShareMode,     //Разделяемый доступ

   LPSECURITY_ATTRIBUTES lpSecurityAttributes, //безопасность

   DWORD dwCreationDistribution,// Описание

   DWORD dwFlagsAndAttributes,  // Атрибуты файла

   HANDLE hTemplateFile   // Файл шаблона

  );

Теперь рассмотрим подробно все параметры:

  •  lpFileName - Указатель на строку содержащую имя создаваемого файла или устройства.
  •  dwDesiredAccess - тип доступа. Может принимать значения (можно использовать одно или сразу несколько):
    •  0 - запрос. Функция не даст реального доступа к файлу, а выполнится как тест возможности создания или открытия файла (устройства).
    •  GENERIC_READ - получить доступ к чтению
    •  GENERIC_WRITE - получить доступ к записи
  •  dwShareMode - флаги, указывающие на то, как создаваемый (открываемый) объект должен разделять доступ между процессами. Это значит, как будет делится доступ к файлу с другими программами если они тоже попытаются открыть этот файл. Параметр может принимать значения (можно использовать одно или сразу несколько):
    •  FILE_SHARE_DELETE - другим процессам разрешается доступ к файла (устройству) только если требуется доступ на удаление (поддерживается только в Windows NT).
    •  FILE_SHARE_READ - другим процессам разрешается только читать файл
    •  FILE_SHARE_WRITE - другим процессам разрешается только писать в файл
  •  lpSecurityAttributes - указатель на структуру типа SECURITY_ATTRIBUTES. Этот параметр используется только в Windows NT, в Win9x он игнорируется.
  •  dwCreationDistribution - описывает, что делать с файлом если он уже существует или его ещё нет. Параметр может принимать только одно из следующих значений (комбинация не допускается):
    •  CREATE_NEW - создать новый файл. Если он уже существует, то произойдёт ошибка
    •  CREATE_ALWAYS - а я сказал создать новый файл. Если файл существует, то он будет перезаписан (обнулён).
    •  OPEN_EXISTING - открыть существующий файл (устройство). Если файла нет, то произойдёт ошибка.
    •  OPEN_ALWAYS - а я сказал открыть файл. Если файла нет, то он будет создан как при использовании CREATE_NEW.
    •  TRUNCATE_EXISTING - открыть файл и обрезать его размер до нуля. Параметр dwDesiredAccess должен содержать GENERIC_WRITE. Если файла нет, то произойдёт ошибка.
  •  dwFlagsAndAttributes - атрибуты создаваемого файла. Параметр может принимать комбинацию из значений:
    •  FILE_ATTRIBUTE_NORMAL
      •  FILE_ATTRIBUTE_ARCHIVE - архивный
      •  FILE_ATTRIBUTE_COMPRESSED - сжатый
      •  FILE_ATTRIBUTE_HIDDEN - скрытый
      •  FILE_ATTRIBUTE_NORMAL - нормальный
      •  FILE_ATTRIBUTE_OFFLINE - данные файла недоступны
      •  FILE_ATTRIBUTE_READONLY - только для чтения 
      •  FILE_ATTRIBUTE_SYSTEM - системный
      •  FILE_ATTRIBUTE_TEMPORARY - временный
    •  FILE_FLAG_WRITE_THROUGH - возможность записи в файл через кэш.
    •  FILE_FLAG_NO_BUFFERING - нельзя использовать буферы или кэш
    •  FILE_FLAG_RANDOM_ACCESS - случайный доступ. Используется для оптимизации кэша
    •  FILE_FLAG_SEQUENTIAL_SCAN - доступ к файлу может быть последовательный от начала до конца
    •  FILE_FLAG_DELETE_ON_CLOSE - операционная система должна удалить файл, когда все указатели на файл будут закрыты
    •  FILE_FLAG_BACKUP_SEMANTICS - Backup файл, т.е. файл резервного копирования.
    •  FILE_FLAG_POSIX_SEMANTICS - доступ осуществляется в POSIX стандарте.
    •  SECURITY_SQOS_PRESENT
      •  SECURITY_ANONYMOUS - анонимный доступ
      •  SECURITY_IDENTIFICATION - идентификационный доступ
      •  SECURITY_IMPERSONATION - персональный доступ
      •  SECURITY_DELEGATION - коллективный доступ
      •  SECURITY_CONTEXT_TRACKING - динамический режим доступа
      •  SECURITY_EFFECTIVE_ONLY - ограничение групп и привилегий
  •  hTemplateFile - файл шаблона

Если функция выполнилась без проблем, то она возвращает указатель на открытое (созданное) устройства.

Если произошла ошибка, то функция вернёт INVALID_HANDLE_VALUE.

DeleteFile

Функция удаления существующего файла

Существует в: Win16, Win32, Win NT

объявлена в winbase.h.

Объявление:

 

 BOOL DeleteFile(

   LPCTSTR lpFileName  // Указатель на строку с полным именем файла

  );

 FindFirstFile

Функция запускает поиск файла в указанной директории.

Существует в: Win16, Win32, Win NT

объявлена в winbase.h.

Объявление:

 

  HANDLE FindFirstFile(

   LPCTSTR lpFileName, // Строка содержащая путь для поиска файлов.

   LPWIN32_FIND_DATA lpFindFileData // Информация о файле

  );

Здесь стоит посмотреть на оба параметра подробнее:

  •  lpFileName - строка содержащая путь для поиска файла. Эта строка может указывать на конкретный файл типа 'c:filename.txt' или может хранить шаблон 'c:*.txt'. Если указывается шаблон, то это даёт возможность перечислить все файлы удовлетворяющие шаблону.
  •  lpFindFileData - структура WIN32_FIND_DATA, в которую будет записана информация о найденном файле.

Рассмотрим структуру WIN32_FIND_DATA немного подробнее:

 typedef struct _WIN32_FIND_DATA {

   DWORD dwFileAttributes;  // Атрибуты файла

   FILETIME ftCreationTime; // Время создания

   FILETIME ftLastAccessTime;  //Время последнего доступа

   FILETIME ftLastWriteTime;   //Время последней записи в файл

   DWORD    nFileSizeHigh;     //Верхний байт размера файла

   DWORD    nFileSizeLow;      //Нижний байт размера файла

   DWORD    dwReserved0;       //Зарезервировано

   DWORD    dwReserved1;       //Зарезервировано

   TCHAR    cFileName[ MAX_PATH ];    //Имя файла

   TCHAR    cAlternateFileName[ 14 ]; //Имя файла для отображения в DOS (8:3)

 } WIN32_FIND_DATA;

Атрибутами файла может быть комбинация из флагов:

  •  FILE_ATTRIBUTE_ARCHIVE - архивный
  •  FILE_ATTRIBUTE_COMPRESSED - сжатый
  •  FILE_ATTRIBUTE_HIDDEN - скрытый
  •  FILE_ATTRIBUTE_NORMAL - нормальный
  •  FILE_ATTRIBUTE_OFFLINE - данные файла недоступны
  •  FILE_ATTRIBUTE_READONLY - только для чтения 
  •  FILE_ATTRIBUTE_SYSTEM - системный
  •  FILE_ATTRIBUTE_TEMPORARY - временный

Размер файла разложен на два байта. Чтоб получить полный размер файла нужно выполнить действие (FInfo.nFileSizeHigh * MAXDWORD) + FInfo.nFileSizeLow. Это не самый эффективный (эффективнее сдвигать), но самый понятный способ.

Функция возвращает указатель на найденный файл, если нет то возврат будет типа ERROR_NO_MORE_FILES.

FindNextFile

Функция продолжает поиск начатый с помощью FindFirstFile.

Существует в: Win16, Win32, Win NT

объявлена в winbase.h.

Объявление:

 

 BOOL FindNextFile(

   HANDLE hFindFile, // Указатель на файл из предыдущего поиска

   LPWIN32_FIND_DATA lpFindFileData // Информация о файле

  );

Со вторым параметром всё ясно, он такой же, как и у FindFirstFile. А вот первый - это указатель на файл из предыдущего поиска. Он нужен, чтобы функция FindNextFile знала на каком файле ты остановил поиск и какой надо найти следующим. Немного позже мы рассмотрим реальный пример, чтобы тебе стало понятнее.

FindClose

Функция завершает поиск файлов.

Существует в: Win16, Win32, Win NT

объявлена в winbase.h.

Объявление:

 BOOL FindClose(

   HANDLE hFindFile  // Указатель на последний найденный файл

  );

GetCurrentDirectory

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

Существует в: Win16, Win32, Win NT

объявлена в winbase.h.

Объявление:

  DWORD GetCurrentDirectory(

   DWORD nBufferLength, // Размер буфера, в котором будет храниться путь

   LPTSTR lpBuffer   // Сам буфер

  );

Если произошла ошибка, то функция вернёт 0. Если ОК, то она вернёт длину lpBuffer в котором хранится путь текущей директории.

SetCurrentDirectory

Функция позволяет узнать текущую директорию, с которой сейчас программа.

Существует в: Win16, Win32, Win NT

объявлена в winbase.h.

Объявление:

 

  BOOL SetCurrentDirectory(

   LPCTSTR lpPathName  // Новая директория

  );

 Если произошла ошибка, то функция вернёт 0. Если всё ОК, то она вернёт не ноль.

GetDiskFreeSpaceEx

Функция возвращает информацию о доступном дисковом пространстве.

Существует в: Win NT, Win9x начиная с Win95 OSR2. До этого существовала версия GetDiskFreeSpace, которая не учитывает диски большого размера.

объявлена в winbase.h. .

Объявление:

 

BOOL GetDiskFreeSpaceEx(

 LPCTSTR lpDirectoryName,                     // Имя диска

 PULARGE_INTEGER lpFreeBytesAvailableToCaller,// Здесь вернут количество доступных байт

 PULARGE_INTEGER lpTotalNumberOfBytes,        // Общее количество байт на диске

 PULARGE_INTEGER lpTotalNumberOfFreeBytes     // Здесь вернут количество свободных байт

 );

Первый параметр содержат имя диска, например 'c:' или 'D:'. В остальных параметрах нужно указать переменные, в которые будут помещены данные о диске.

Если всё ОК, то функция вернёт TRUE

GetCompressedFileSize

Функция возвращает сжатый размер файла если он находится на диске поддерживающем сжатие. Если диск не сжат, то функция вернёт актуальное значение размера.

Существует в: Win NT

объявлена в winbase.h. .

Объявление:

 

  DWORD GetCompressedFileSize(

  LPCTSTR lpFileName,    // Имя файла

  LPDWORD lpFileSizeHigh // Здесь вернут указатель на размер файла

  );

В параметре lpFileSizeHigh возвращается только верхние два байта. Нижние два байта вернёт сама функция.

Если всё ОК, то функция возвращает младшие два байта размера диска, иначе возвращает 0xFFFFFFFF.

GetDriveType

Возвращает тип драйва, такого как диск, CD-ROM, сетевой диск и так далее.

Существует в: Win NT, Win32s, Win9x.

объявлена в winbase.h. .

Объявление:

    UINT GetDriveType(

   LPCTSTR lpRootPathName // Описатель устройства

  );

 В качестве параметра можно передавать буквы диска в виде 'a:', 'B:', 'C:' и так далее. Если всё нормально, то функция вернёт:

  •  0 - Устройство не определено.
  •  1 - The root directory does not exist.
  •  DRIVE_REMOVABLE - переносное устройства.
  •  DRIVE_FIXED - не переносное устройство (типа жёсткого диска).
  •  DRIVE_REMOTE - удалённое устройство (типа сетевого диска).
  •  DRIVE_CDROM - CD-ROM.
  •  DRIVE_RAMDISK - диск памяти.

GetFileSize

Функция возвращает размер файла.

Существует в: Win NT, Win32s, Win9x.

объявлена в winbase.h. .

Объявление:

 

 DWORD GetFileSize(

  HANDLE hFile,    // Указатель на файл

  LPDWORD lpFileSizeHigh // Здесь вернут старший байт размера файла

  );

В параметре lpFileSizeHigh возвращается только верхние два байта. Нижние два байта вернёт сама функция.

Если всё ОК, то функция возвращает младшие два байта размера файла, иначе возвращает 0xFFFFFFFF.

GetFileType

Функция возвращает тип файла.

Существует в: Win NT, Win32s, Win9x.

объявлена в winbase.h. .

Объявление:

 

  DWORD GetFileType(

   HANDLE hFile,  // Указатель на файл

  );

Функция возвращает тип файла. Если всё ОК, то результатом будет:

  •  FILE_TYPE_UNKNOWN - тип файла не определён
  •  FILE_TYPE_DISK - простой дисковый файл
  •  FILE_TYPE_CHAR - консольный файл или LPT-устройство
  •  FILE_TYPE_PIPE - именованный или анонимный канал.

GetLogicalDrives

Функция возвращает маску доступных дисков

Существует в: Win NT, Win32s, Win9x.

объявлена в winbase.h. .

Объявление:

 DWORD GetLogicalDrives(VOID)

Функции не нужны параметры. Она возвращает маску доступных в системе дисков.

GetShortPathName

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

Существует в: Win NT, Win32s, Win9x.

объявлена в winbase.h. .

Объявление:

   DWORD GetShortPathName(

   LPCTSTR lpszLongPath, //Указатель на длинный путь к файлу

   LPTSTR lpszShortPath, // Сюда поместять результат

   DWORD cchBuffer    // Длинна буфера, куда поместят результат

  );

 если всё ОК, то функция вернёт длину строки lpszShortPath, где будет находится короткий путь к файлу.

GetTempPath

Возвращает путь к директории, в которой хранятся временные файлы. По умолчанию это c:WindowsTemp.

Существует в: Win NT, Win32s, Win9x.

объявлена в winbase.h. .

Объявление:

 DWORD GetTempPath(

   DWORD nBufferLength, // Размер буфера

   LPTSTR lpBuffer   // Буфер

  );

Если всё ОК, то функция вернёт длину строки содержащей путь. Сам путь будет находится в буфере (второй параметр).

GetVolumeInformation

Получение информации о диске.

Существует в: Win NT, Win32s, Win9x.

объявлена в winbase.h. .

Объявление:

BOOL GetVolumeInformation(

 LPCTSTR lpRootPathName, // Какой диск

 LPTSTR lpVolumeNameBuffer, // Буфер для имени метки

 DWORD nVolumeNameSize, // Размер буфера метки

 LPDWORD lpVolumeSerialNumber, // Серийный номер

 LPDWORD lpMaximumComponentLength,// Максимальная длинна компонентов

 LPDWORD lpFileSystemFlags, // Системные флаги

 LPTSTR lpFileSystemNameBuffer,// Буфер имени файловой системы

 DWORD nFileSystemNameSize  // Размер буфера имени файловой сист.

 );

Просто передай в качестве первого параметра имя диска (например 'C:') и получи кучу инфы про этот диск.

MoveFile

Переместить существующий файл на новое место.

Существует в: Win NT, Win32s, Win9x.

объявлена в winbase.h. .

Объявление:

 BOOL MoveFile(

   LPCTSTR lpExistingFileName, // Полный путь к исходному файлу

   LPCTSTR lpNewFileName  // Полный путь к новому месту

  );

Если все нормально, то функция возвращает TRUE.

ReadFile

Функция читает из файла блок данных начиная с текущей позиции. После прочтения блока, позиция переносится в конец прочитанного блока.

Существует в: Win NT, Win9x, Win32s.

объявлена в winbase.h. .

Объявление:

   BOOL ReadFile(

   HANDLE hFile, // Указатель на открытый файл

   LPVOID lpBuffer, // Указатель на буфер, куда поместится прочитанный блок

   DWORD nNumberOfBytesToRead, // количество прочитанных байтов

   LPDWORD lpNumberOfBytesRead,// указатель на число прочитанных данных

   LPOVERLAPPED lpOverlapped  // указатель на структуру OVERLAPPED

  );

Если всё ОК, то функция вернёт TRUE.

RemoveDirectory

Функция удаляет директорию. Если внутри есть хотя бы один файл или другая директория, то произойдёт ошибка. Удаление возможно только пустой директории.

Существует в: Win NT, Win9x, Win32s.

Объявление:

 

  BOOL RemoveDirectory(

   LPCTSTR lpPathName  // Указатель на путь директории

  );

 

Если всё ОК, то функция вернёт TRUE.

Пример использования: RemoveDirectory("с:Windows");

SetCurrentDirectory

Функция изменяет текущую директорию на указанную. Это значит, что когда ты будешь использовать другие функции работы с файлами, и не указывать путь, то ОС будет искать файл в этой директории.

Существует в: Win NT, Win9x, Win32s.

объявлена в winbase.h. .

Объявление:

 

  BOOL SetCurrentDirectory(

   LPCTSTR lpPathName  // Указатель на строку, содержащую путь

  );

Если всё ОК, то функция вернёт TRUE.

SetEndOfFile

Функция делает текущую позицию файла концом файла. Если тебе нужно сократить размер файла, то вызови эту функцию, установи курсор в необходимую позицию и вызови эту функцию.

Существует в: Win NT, Win9x, Win32s.

объявлена в winbase.h. .

Объявление:

  BOOL SetEndOfFile(

   HANDLE hFile  // Указатель на открытый файл

  );

Если всё ОК, то функция вернёт TRUE.

SetFileAttributes

Функция позволяет устанавливать на файл атрибуты.

Существует в: Win NT, Win9x, Win32s.

объявлена в winbase.h. .

Объявление:

  BOOL SetFileAttributes(

   LPCTSTR lpFileName,    // Путь к файлу

   DWORD dwFileAttributes // Будущие атрибуты файла

  );

С первым параметром всё ясно. Это просто путь к файлу. А вот второй параметр это атрибуты. Они могут быть в виде сочетания следующих флагов:

 

  •  FILE_ATTRIBUTE_ARCHIVE - атрибут архивного файла.
  •  FILE_ATTRIBUTE_HIDDEN - атрибут спрятанного файла.
  •  FILE_ATTRIBUTE_NORMAL - атрибут нормального файла.
  •  FILE_ATTRIBUTE_OFFLINE - указывает на то, что данные файла не доступны и находятся на отключённом устройстве
  •  FILE_ATTRIBUTE_READONLY - атрибут файла только для чтения.
  •  FILE_ATTRIBUTE_SYSTEM - атрибут системного файла.
  •  FILE_ATTRIBUTE_TEMPORARY - атрибут временного файла.

Если всё ОК, то функция вернёт TRUE.

SetFilePointer

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

Существует в: Win NT, Win9x, Win32s.

объявлена в winbase.h. .

Объявление:

  DWORD SetFilePointer(

   HANDLE hFile,       // Указатель на открытый файл

   LONG lDistanceToMove,     // количество байт, на которые надо передвинуться

   PLONG lpDistanceToMoveHigh, // Второй байт, указывающий количество байт

   DWORD dwMoveMethod        //Откуда нужно начинать двигаться

  );

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

 

  •  FILE_BEGIN - Передвинуться от начала файла вперёд.
  •  FILE_CURRENT - Передвинуться начиная от текущей позиции вперёд.
  •  FILE_END - Передвинуться от конца файла к началу.

Если всё ОК, то функция вернёт младший байт установленной позиции.

Если ты хочешь узнать текущую позицию файла, то можешь смухлевать, вызвав функцию с такими параметрами: SetFilePointer(h,0,0, FILE_CURRENT). Этим ты заставляешь передвинутся на 0 байтов от текущей позиции. Передвижения не произойдёт, но функция вернёт новую позицию файла, то есть текущую.

SetVolumeLabel

Функция устанавливает метку тома

Существует в: Win NT, Win9x.

объявлена в winbase.h. .

Объявление:

 

  BOOL SetVolumeLabel(

   LPCTSTR lpRootPathName, // Указатель на имя тома

   LPCTSTR lpVolumeName    // Метка тома

  );

Если всё ОК, то функция вернёт TRUE.

WriteFile

Функция производит запись блока данных начиная с текущей позиции в файле.

Существует в: Win NT, Win9x, Win32s.

объявлена в winbase.h. .

Объявление:

 

  BOOL WriteFile(

   HANDLE hFile, // Указатель на открытый файл

   LPCVOID lpBuffer, // Указатель на данные для записи

   DWORD nNumberOfBytesToWrite,   // Количество записанных байт

   LPDWORD lpNumberOfBytesWritten,// Указатель на количество записанных байт

   LPOVERLAPPED lpOverlapped  // Указатель на структуру OVERLAPPED

  );

Если всё ОК, то функция вернёт TRUE.

Использование файлов, проецируемых на память

При работе с Win32 существует возможность читать и записывать данные в файл так, как будто это блок памяти. Этот прием часто рекомендуется использовать также при разделении памяти между двумя и более процессами.

Рассмотрим простейший подход к вводу-выводу с использованием файлов, проецируемых в память (memory mapped files).

Сначала создается обычный файл hFile с использованием функции CreateFile, затем вызывается функция:

 

 HANDLE hMap=CreateFileMapping(hFile, NULL, dwProtect, 0, 0, szName);

 

Параметр dwProtect принимает одно из следующих значений - PAGE_READONLY, PAGEWRITECOPY, PAGE_READWRITE - и должен быть совместим с режимом разделения файла между процессами. Последний параметр функции - необязательное имя, обычно используемое для разделения данных между процессами. В этом случае функция OpenFileMapping открывает тот же файл с указанным именем. Обе функции возвращают значение типа HANDLE.

Если необходимо осуществить доступ к части файла, то вызывается функция MapViewOfFile:

 

 LPVOID p=MapViewOfFile(hMap,dwAccess,dwHigh,dwLow,dwNumber);

 

Весь файл или его часть могут быть спроецированы в память, начиная с заданного 64-разрядного смещения, которое задается параметрами dwHigh и dwLow (если файл имеет размер меньше 4 ГБ, то очевидно, что dwHigh будет иметь нулевое значение). Параметр dwNumber задает количество байтов, которое необходимо спроецировать на память. Параметр dwAccess указывает на то, что можно с этими данными делать (считывать и записывать или только считывать), и должен соответствовать параметру dwProtect функции CreateFileMapping.

После этого можно использовать указатель, возвращаемый функцией, для доступа или модификации данных в файле. Функция FlushViewOfFile записывает на диск все измененные страницы файла, спроецированного в память. Функция UnmapViewOfFile делает недействительным указатель, возвращаемый функцией MapViewOfFile. Затем необходимо закрыть файл, используя функцию CloseHandle.

 Замечание. Не излишне ли использовать дисковый файл, если необходимо лишь передать несколько байт между приложениями? В действительности нет необходимости явно открывать и использовать дисковый файл для получения отображения в памяти. Приложения могут передать специальное значение дескриптора равное 0хFFFFFFFF в функцию CreateFileMapping для получения отображения непосредственно в системный страничный файл. Это, по сути, создает блок разделяемой между приложениями памяти.