首页 > 代码库 > FATFS 初学之 f_mkdir/ unlink
FATFS 初学之 f_mkdir/ unlink
f_mkdir:
1 /*-----------------------------------------------------------------------*/ 2 /* Create a Directory */ 3 /*-----------------------------------------------------------------------*/ 4 5 FRESULT f_mkdir ( 6 const TCHAR *path /* Pointer to the directory path */ 7 ) 8 { 9 FRESULT res;10 DIR dj;11 BYTE *dir, n;12 DWORD dsc, dcl, pcl, tim = get_fattime();13 DEF_NAMEBUF;14 15 16 res = chk_mounted(&path, &dj.fs, 1);17 if (res == FR_OK) {18 INIT_BUF(dj);19 res = follow_path(&dj, path); /* Follow the file path */20 if (res == FR_OK) res = FR_EXIST; /* Any object with same name is already existing */21 if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NS] & NS_DOT))22 res = FR_INVALID_NAME;23 if (res == FR_NO_FILE) { /* Can create a new directory */24 dcl = create_chain(dj.fs, 0); /* Allocate a cluster for the new directory table */25 res = FR_OK;26 if (dcl == 0) res = FR_DENIED; /* No space to allocate a new cluster */27 if (dcl == 1) res = FR_INT_ERR;28 if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR;29 if (res == FR_OK) /* Flush FAT */30 res = move_window(dj.fs, 0);31 if (res == FR_OK) { /* Initialize the new directory table */32 dsc = clust2sect(dj.fs, dcl);33 dir = dj.fs->win;34 mem_set(dir, 0, SS(dj.fs));35 mem_set(dir+DIR_Name, ‘ ‘, 8+3); /* Create "." entry */36 dir[DIR_Name] = ‘.‘;37 dir[DIR_Attr] = AM_DIR;38 ST_DWORD(dir+DIR_WrtTime, tim);39 ST_CLUST(dir, dcl);40 mem_cpy(dir+SZ_DIR, dir, SZ_DIR); /* Create ".." entry */41 dir[33] = ‘.‘; pcl = dj.sclust;42 if (dj.fs->fs_type == FS_FAT32 && pcl == dj.fs->dirbase)43 pcl = 0;44 ST_CLUST(dir+SZ_DIR, pcl);45 for (n = dj.fs->csize; n; n--) { /* Write dot entries and clear following sectors */46 dj.fs->winsect = dsc++;47 dj.fs->wflag = 1;48 res = move_window(dj.fs, 0);49 if (res != FR_OK) break;50 mem_set(dir, 0, SS(dj.fs));51 }52 }53 if (res == FR_OK) res = dir_register(&dj); /* Register the object to the directoy */54 if (res != FR_OK) {55 remove_chain(dj.fs, dcl); /* Could not register, remove cluster chain */56 } else {57 dir = dj.dir;58 dir[DIR_Attr] = AM_DIR; /* Attribute */59 ST_DWORD(dir+DIR_WrtTime, tim); /* Created time */60 ST_CLUST(dir, dcl); /* Table start cluster */61 dj.fs->wflag = 1;62 res = sync(dj.fs);63 }64 }65 FREE_BUF();66 }67 68 LEAVE_FF(dj.fs, res);69 }
函数功能:创建一个目录
描述:
f_mkdir函数当_FS_READONLY == 0并且_FS_MINIMIZE == 0时可用。
f_mkdir函数创建一个新目录。
f_unlink:
1 /*-----------------------------------------------------------------------*/ 2 /* Delete a File or Directory */ 3 /*-----------------------------------------------------------------------*/ 4 5 FRESULT f_unlink ( 6 const TCHAR *path /* Pointer to the file or directory path */ 7 ) 8 { 9 FRESULT res;10 DIR dj, sdj;11 BYTE *dir;12 DWORD dclst;13 DEF_NAMEBUF;14 15 16 res = chk_mounted(&path, &dj.fs, 1);17 if (res == FR_OK) {18 INIT_BUF(dj);19 res = follow_path(&dj, path); /* Follow the file path */20 if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT))21 res = FR_INVALID_NAME; /* Cannot remove dot entry */22 #if _FS_SHARE23 if (res == FR_OK) res = chk_lock(&dj, 2); /* Cannot remove open file */24 #endif25 if (res == FR_OK) { /* The object is accessible */26 dir = dj.dir;27 if (!dir) {28 res = FR_INVALID_NAME; /* Cannot remove the start directory */29 } else {30 if (dir[DIR_Attr] & AM_RDO)31 res = FR_DENIED; /* Cannot remove R/O object */32 }33 dclst = LD_CLUST(dir);34 if (res == FR_OK && (dir[DIR_Attr] & AM_DIR)) { /* Is it a sub-dir? */35 if (dclst < 2) {36 res = FR_INT_ERR;37 } else {38 mem_cpy(&sdj, &dj, sizeof(DIR)); /* Check if the sub-dir is empty or not */39 sdj.sclust = dclst;40 res = dir_sdi(&sdj, 2); /* Exclude dot entries */41 if (res == FR_OK) {42 res = dir_read(&sdj);43 if (res == FR_OK /* Not empty dir */44 #if _FS_RPATH45 || dclst == sdj.fs->cdir /* Current dir */46 #endif47 ) res = FR_DENIED;48 if (res == FR_NO_FILE) res = FR_OK; /* Empty */49 }50 }51 }52 if (res == FR_OK) {53 res = dir_remove(&dj); /* Remove the directory entry */54 if (res == FR_OK) {55 if (dclst) /* Remove the cluster chain if exist */56 res = remove_chain(dj.fs, dclst);57 if (res == FR_OK) res = sync(dj.fs);58 }59 }60 }61 FREE_BUF();62 }63 LEAVE_FF(dj.fs, res);64 }
函数功能:移除一个对象
描述:
f_unlink函数当_FS_READONLY == 0并且_FS_MINIMIZE == 0时可用。
f_unlink函数移除一个对象。不要移除打开的对象或当前目录。
例:
1 res = f_mkdir("sub1"); // 在根目录下创建 sub1目录2 if (res) die(res);3 res = f_mkdir("sub1/sub2"); // 在 sub1目录下创建 sub2目录4 if (res) die(res);5 res = f_mkdir("sub1/sub2/sub3");6 if (res) die(res);7 // ...8 f_unlink("SD.txt"); //删除跟目录下文件 SD.txt
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。