libfat-src-20070127 を ロングファイル名読み込みに対応させたもの

最新バージョン:2007/09/03版

・070903版で、ファイル時間取得部分を更新しました。 ・アーカイブ内のコードサンプルよりも、Wikiに書いてあるコードサンプルの方が詳しいのでWikiの方を使ってみてください。

libfat-src-20070127 のアーカイブファイルからソースを使わせて頂いてます。 一部、2007/09/01 に作者の方によって更新されたファイルが Source Forge の CVS にアップロードされていましたので、 その分を追加しています。

http://devkitpro.cvs.sourceforge.net/devkitpro/libfat/

主に directory.c のファイル名取得部分を変更しています。

dirnext関数で8.3形式の短いファイル名を返すように変更しました。

あと、 libfat.c に、

bool fatGetLongFileName (DIR_ITER *dirState, char *filename);

を追加しました。 これを使う場合は、 fatlfn.h をインクルードしてください。 dirnext 呼び出し「前」に呼び出すことで、カレントエントリーの ロングファイル名を取得できます。

書き込みに関してはまだソースを読めていないのと、 実験していないのもあって、おかしくなる可能性があります。

ファイル読み込みと、ファイル列挙以外の用途で使用する場合は devkit付属のlibfatをそのまま使ってください。 ファイルやSDカードのFATが壊れて読み込めなく可能性があります。

*注:このライブラリは、libfat をロングファイル名に対応させたもの というより、 正確には 2 バイト文字のファイル名の読み込みに対応させたものです。 普通の libfat でも、ASCII 文字で構成されたファイル名であれば ロングファイル名をそのまま読めるそうです。

コードサンプル

// ------------------------------------------------------------------
// ファイル列挙サンプル
// ------------------------------------------------------------------

#include <stdio.h>
#include <nds.h>
#include <fat.h>
#include <sys/dir.h>
#include "fatlfn.h"

int enumdir(char *path);

int main(void)
{
	powerON(POWER_ALL);
	videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE);
	vramSetBankC(VRAM_C_SUB_BG);
	SUB_BG0_CR = BG_MAP_BASE(31);
	BG_PALETTE_SUB[255] = RGB15(31,31,31);
	consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(31), (u16*)CHAR_BASE_BLOCK_SUB(0), 16);

	if ( fatInitDefault() ) {
		iprintf("File System Init OK\n");
	} else {
		iprintf("File System Init Error\n");
		return 1;
	}
	fatMountNormalInterface(PI_DEFAULT, 0x8000);

	// libfatの仕様上、"fat0:/" とすべきところですが、
	// デフォルトのまま使用すると fat0 (DSカードスロットにささったSDカード)
	// が使われるので、そのまま "/" としています。
	// GBA カードスロットにささった記憶領域を使うマジコンの場合、
	// enumdir("fat1:/"); と指定する必要があるかもしれません。
	enumdir("/");
	
	while(1) {;}
	return 0;
}

int enumdir(char *path)
{
	char filename[256];
	char longfilename[256];
	struct stat st;
	DIR_ITER* dp;
	int i;

	dp = diropen(path);
	
	if ( dp == NULL ) {
		return -1;
	}
	
	fatGetLongFileName(dp, longfilename);
	
	while ( dirnext(dp, filename, &st) == 0 ) {
		// 先頭2バイトが'\0'の場合、ロングファイル名が空
		if ( longfilename[0] != '\0' && longfilename[1] != '\0' ) {
			// ファイル名をUTF16から他の文字コードに
			// 変換する関数をここで呼び出す
			// utf16_to_sjis(longfilename);
		}
		
		iprintf("Short File Name : %s\n", filename);

		// 実際にはiprintfでは日本語文字列が表示できないので
		// コメントアウトしてあります。
		// 日本語文字列を表示できるprintfなどをご自身で実装して
		// 使ってください。
		//iprintf("Long  File Name : %s\n", longfilename);
		
		// とりあえずロングファイル名の先頭10バイトの値の確認だけ
		iprintf("Long  File Name : ");
		for ( i = 0; i < 10; i++ ) {
			iprintf("%02x ", longfilename[i]);
		}
		iprintf("\n");
		fatGetLongFileName(dp, longfilename);
	}
	dirclose(dp);
	
	return 0;
}
// ------------------------------------------------------------------
// ファイル時間取得サンプル (070903版用)
//
// gmtimeの代わりにlocaltimeでも使えると思います。
// 実行確認していませんので、コンパイルエラーが出たりしたら
// ごめんなさい。
// ------------------------------------------------------------------

#include <sys/dir.h>
#include <time.h>

int getfiletime(char *path)
{
	char filename[256];
	struct stat st;
	DIR_ITER* dp;
	struct tm *ptime;
	
	dp = diropen(path);
	
	if ( dp == NULL ) {
		return -1;
	}
	
	while ( dirnext(dp, filename, &st) == 0 ) {
		iprintf("Filename : %s\n", filename);
		ptime = gmtime(&st.st_ctime);
		iprintf("Creation Time :%04d/%02d/%02d %02d:%02d:%02d\n", 
								ptime->tm_year + 1900, 
								ptime->tm_mon + 1, 
								ptime->tm_mday, 
								ptime->tm_hour, 
								ptime->tm_min, 
								ptime->tm_sec);
		ptime = gmtime(&st.st_mtime);
		iprintf("Last Write Time :%04d/%02d/%02d %02d:%02d:%02d\n", 
								ptime->tm_year + 1900, 
								ptime->tm_mon + 1, 
								ptime->tm_mday, 
								ptime->tm_hour, 
								ptime->tm_min, 
								ptime->tm_sec);
	}
	dirclose(dp);
	
	return 0;
}

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-10-27 (日) 17:45:25 (3261d)