This topic describes how to retrieve drive and volume information.
The class RFs
provides a number of functions that extract
drive and volume information.
The FileSystemSubType() function returns the sub type of a drive. This information can be used to warn a user if they try to use a volume that is not of the correct format.
The volume information supplied by VolumeIOParam() is particularly useful as it allows you to get specific properties for a volume. This includes the block size of the underlying media for read/write operations, allowing your application to access data on the underlying media in the most efficient way. For example:
Applications that download from a local or network connection to transfer files, for example, bluetooth beaming, HTTP, FTP, may be able to improve their performance by knowing the recommended block and cluster sizes.
For Multimedia source data, reading in optimal sized blocks may help to achieve a consistent read speed.
RFs::DriveList()
retrieves
an array of drives. The drive list consists of an array of 26 bytes. Array
index zero corresponds to drive A, one equals B and so on. If the value of
an array member is 1 the corresponding drive exists. If this drive is able
to contain removable media then use RFs::Drive
to test
for its presence.
The following code prints each drive in the drive list as a letter, followed by the hex value of the integer indicating the drive's attributes.
TDriveList drivelist; TChar driveLetter; TInt driveNumber; _LIT(KDrive,"%c: %02x "); User::LeaveIfError(fsSession.DriveList(drivelist)); for(driveNumber=EDriveA;driveNumber<=EDriveZ;driveNumber++) { if (drivelist[driveNumber]) { User::LeaveIfError(fsSession.DriveToChar(driveNumber,driveLetter)); console->Printf(KDrive, TUint(driveLetter), drivelist[driveNumber]); } }
RFs::Drive()
retrieves
the attributes of the drive specified with TDriveInfo
.
The following example loops through all possible drives, a-z, and prints a
message if a drive is flash-based.
TChar driveLetter; TDriveInfo driveInfo; TInt driveNumber; _LIT(KFlash,"Drive %c is flash\n"); for (driveNumber=EDriveA; driveNumber<=EDriveZ; driveNumber++) { fsSession.Drive(driveInfo, driveNumber); if (driveInfo.iDriveAtt == KDriveAbsent) continue; if (driveInfo.iType == EMediaFlash) { User::LeaveIfError(fsSession.DriveToChar(driveNumber, driveLetter)); console->Printf(KFlash, driveLetter); } }
To
retrieve the sub type of the volume use RFs::FileSystemSubType()
.
Pass this function a drive number and a TFSName for the
sub type. For example, the sub type can be 'FAT16' of the Fat file system.
Note: For file systems that do not have a sub type, for example a ROM file system, the name of the file system is returned, in this case 'ROM'.
TChar driveLetter; TFSName name; TInt driveNumber; _LIT(KSubType,"Drive %c is Sub Type: %S\n"); for (driveNumber=EDriveA; driveNumber<=EDriveZ; driveNumber++) { TInt err = fsSession.FileSystemSubType(driveNumber, name); if (err != KErrNone) continue; User::LeaveIfError(fsSession.DriveToChar(driveNumber, driveLetter)); console->Printf(KSubType, driveLetter, &name); }
Use RFs::Volume()
to
get the volume information, with a TVolumeInfo
object.
The information returned includes a TDriveInfo
object with
the volume name, its unique ID, size and the amount of free space.
The following example prints out the names of volumes:
TChar driveLetter; TVolumeInfo volumeInfo; TInt driveNumber; _LIT(KVolName,"Volume name: %S\n"); for (driveNumber=EDriveA; driveNumber<=EDriveZ; driveNumber++) { TInt err = fsSession.Volume(volumeInfo, driveNumber); if (err != KErrNone) continue; User::LeaveIfError(fsSession.DriveToChar(driveNumber, driveLetter)); console->Printf(KVolName, &volumeInfo.iName); }
Note: Use the return value from RFs::Volume()
to
test whether a volume is present in the drive, a value of KErrNotReady indicates
that there is no volume present.
Use RFs::VolumeIOParam
to
retrieve volume information, with a TVolumeIOParamInfo
object.
The object returns the recommended sizes for read and write operations on
memory and buffers.
TChar driveLetter; TVolumeIOParamInfo volumeparamInfo; TInt driveNumber; _LIT(KRecWriteSize,"Drive %c's recommended write size: %d\n"); for (driveNumber=EDriveA; driveNumber<=EDriveZ; driveNumber++) { TInt err = fsSession.VolumeIOParam(driveNumber, volumeparamInfo); if (err != KErrNone) continue; User::LeaveIfError(fsSession.DriveToChar(driveNumber, driveLetter)); console->Printf(KRecWriteSize, driveLetter, &volumeparamInfo.iRecWriteBufSize); }