📄 tff_8c-source.html
字号:
<a name="l00471"></a>00471 <span class="keywordflow">if</span> (n >= t) <span class="keywordflow">break</span>;<a name="l00472"></a>00472 dirname[n++] = c;<a name="l00473"></a>00473 }<a name="l00474"></a>00474 <span class="keywordflow">return</span> 1;<a name="l00475"></a>00475 }<a name="l00476"></a>00476 <a name="l00477"></a>00477 <a name="l00478"></a>00478 <a name="l00479"></a>00479 <span class="comment">/*-----------------------------------------------------------------------*/</span><a name="l00480"></a>00480 <span class="comment">/* Trace a file path */</span><a name="l00481"></a>00481 <span class="comment">/*-----------------------------------------------------------------------*/</span><a name="l00482"></a>00482 <a name="l00483"></a>00483 <span class="keyword">static</span><a name="l00484"></a>00484 FRESULT trace_path ( <span class="comment">/* FR_OK(0): successful, !=0: error code */</span><a name="l00485"></a>00485 <a class="code" href="struct__DIR.html">DIR</a> *dirobj, <span class="comment">/* Pointer to directory object to return last directory */</span><a name="l00486"></a>00486 <span class="keywordtype">char</span> *fn, <span class="comment">/* Pointer to last segment name to return */</span><a name="l00487"></a>00487 <span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="comment">/* Full-path string to trace a file or directory */</span><a name="l00488"></a>00488 BYTE **dir <span class="comment">/* Directory pointer in Win[] to retutn */</span><a name="l00489"></a>00489 )<a name="l00490"></a>00490 {<a name="l00491"></a>00491 CLUST clust;<a name="l00492"></a>00492 <span class="keywordtype">char</span> ds;<a name="l00493"></a>00493 BYTE *dptr = NULL;<a name="l00494"></a>00494 <a class="code" href="struct__FATFS.html">FATFS</a> *fs = FatFs;<a name="l00495"></a>00495 <a name="l00496"></a>00496 <span class="comment">/* Initialize directory object */</span><a name="l00497"></a>00497 clust = fs-><a class="code" href="struct__FATFS.html#3c1a4db83aea0aec5eed50b12c72da55">dirbase</a>;<a name="l00498"></a>00498 <span class="preprocessor">#if _FAT32</span><a name="l00499"></a>00499 <span class="preprocessor"></span> <span class="keywordflow">if</span> (fs-><a class="code" href="struct__FATFS.html#91bea3661c2ffe4f65143c163493b995">fs_type</a> == FS_FAT32) {<a name="l00500"></a>00500 dirobj-><a class="code" href="struct__DIR.html#36b08a0927f70fb693aac83949ee19b8">clust</a> = dirobj-><a class="code" href="struct__DIR.html#762e543e9001d96ae71c1a24f52a9759">sclust</a> = clust;<a name="l00501"></a>00501 dirobj-><a class="code" href="struct__DIR.html#edba9551167ea52746b5f2c57ddce945">sect</a> = clust2sect(clust);<a name="l00502"></a>00502 } <span class="keywordflow">else</span><a name="l00503"></a>00503 <span class="preprocessor">#endif</span><a name="l00504"></a>00504 <span class="preprocessor"></span> {<a name="l00505"></a>00505 dirobj-><a class="code" href="struct__DIR.html#36b08a0927f70fb693aac83949ee19b8">clust</a> = dirobj-><a class="code" href="struct__DIR.html#762e543e9001d96ae71c1a24f52a9759">sclust</a> = 0;<a name="l00506"></a>00506 dirobj-><a class="code" href="struct__DIR.html#edba9551167ea52746b5f2c57ddce945">sect</a> = clust;<a name="l00507"></a>00507 }<a name="l00508"></a>00508 dirobj-><a class="code" href="struct__DIR.html#036a031851bde1b63d85c59293412a8d">index</a> = 0;<a name="l00509"></a>00509 dirobj-><a class="code" href="struct__DIR.html#b77148ebe964e29c524ffc843d33c30b">fs</a> = fs;<a name="l00510"></a>00510 <a name="l00511"></a>00511 <span class="keywordflow">if</span> (*path == <span class="charliteral">'\0'</span>) { <span class="comment">/* Null path means the root directory */</span><a name="l00512"></a>00512 *dir = NULL; <span class="keywordflow">return</span> FR_OK;<a name="l00513"></a>00513 }<a name="l00514"></a>00514 <a name="l00515"></a>00515 <span class="keywordflow">for</span> (;;) {<a name="l00516"></a>00516 ds = make_dirfile(&path, fn); <span class="comment">/* Get a paragraph into fn[] */</span><a name="l00517"></a>00517 <span class="keywordflow">if</span> (ds == 1) <span class="keywordflow">return</span> FR_INVALID_NAME;<a name="l00518"></a>00518 <span class="keywordflow">for</span> (;;) {<a name="l00519"></a>00519 <span class="keywordflow">if</span> (!move_window(dirobj-><a class="code" href="struct__DIR.html#edba9551167ea52746b5f2c57ddce945">sect</a>)) <span class="keywordflow">return</span> FR_RW_ERROR;<a name="l00520"></a>00520 dptr = &fs-><a class="code" href="struct__FATFS.html#32c85fa1d26f37661c21f5a1afaa2c08">win</a>[(dirobj-><a class="code" href="struct__DIR.html#036a031851bde1b63d85c59293412a8d">index</a> & 15) * 32]; <span class="comment">/* Pointer to the directory entry */</span><a name="l00521"></a>00521 if (dptr[DIR_Name] == 0) <span class="comment">/* Has it reached to end of dir? */</span><a name="l00522"></a>00522 <span class="keywordflow">return</span> !ds ? FR_NO_FILE : FR_NO_PATH;<a name="l00523"></a>00523 <span class="keywordflow">if</span> (dptr[DIR_Name] != 0xE5 <span class="comment">/* Matched? */</span><a name="l00524"></a>00524 && !(dptr[DIR_Attr] & AM_VOL)<a name="l00525"></a>00525 && !memcmp(&dptr[DIR_Name], fn, 8+3) ) <span class="keywordflow">break</span>;<a name="l00526"></a>00526 <span class="keywordflow">if</span> (!next_dir_entry(dirobj)) <span class="comment">/* Next directory pointer */</span><a name="l00527"></a>00527 <span class="keywordflow">return</span> !ds ? FR_NO_FILE : FR_NO_PATH;<a name="l00528"></a>00528 }<a name="l00529"></a>00529 <span class="keywordflow">if</span> (!ds) { *dir = dptr; <span class="keywordflow">return</span> FR_OK; } <span class="comment">/* Matched with end of path */</span><a name="l00530"></a>00530 <span class="keywordflow">if</span> (!(dptr[DIR_Attr] & AM_DIR)) <span class="keywordflow">return</span> FR_NO_PATH; <span class="comment">/* Cannot trace because it is a file */</span><a name="l00531"></a>00531 clust = <span class="comment">/* Get cluster# of the directory */</span><a name="l00532"></a>00532 <span class="preprocessor">#if _FAT32</span><a name="l00533"></a>00533 <span class="preprocessor"></span> ((DWORD)LD_WORD(&dptr[DIR_FstClusHI]) << 16) |<a name="l00534"></a>00534 #endif<a name="l00535"></a>00535 LD_WORD(&dptr[DIR_FstClusLO]);<a name="l00536"></a>00536 dirobj-><a class="code" href="struct__DIR.html#36b08a0927f70fb693aac83949ee19b8">clust</a> = dirobj-><a class="code" href="struct__DIR.html#762e543e9001d96ae71c1a24f52a9759">sclust</a> = clust; <span class="comment">/* Restart scannig with the new directory */</span><a name="l00537"></a>00537 dirobj-><a class="code" href="struct__DIR.html#edba9551167ea52746b5f2c57ddce945">sect</a> = clust2sect(clust);<a name="l00538"></a>00538 dirobj-><a class="code" href="struct__DIR.html#036a031851bde1b63d85c59293412a8d">index</a> = 2;<a name="l00539"></a>00539 }<a name="l00540"></a>00540 }<a name="l00541"></a>00541 <a name="l00542"></a>00542 <a name="l00543"></a>00543 <a name="l00544"></a>00544 <span class="comment">/*-----------------------------------------------------------------------*/</span><a name="l00545"></a>00545 <span class="comment">/* Reserve a directory entry */</span><a name="l00546"></a>00546 <span class="comment">/*-----------------------------------------------------------------------*/</span><a name="l00547"></a>00547 <a name="l00548"></a>00548 <span class="preprocessor">#if !_FS_READONLY</span><a name="l00549"></a>00549 <span class="preprocessor"></span><span class="keyword">static</span><a name="l00550"></a>00550 FRESULT reserve_direntry ( <span class="comment">/* FR_OK: successful, FR_DENIED: no free entry, FR_RW_ERROR: a disk error occured */</span><a name="l00551"></a>00551 <a class="code" href="struct__DIR.html">DIR</a> *dirobj, <span class="comment">/* Target directory to create new entry */</span><a name="l00552"></a>00552 BYTE **dir <span class="comment">/* Pointer to pointer to created entry to retutn */</span><a name="l00553"></a>00553 )<a name="l00554"></a>00554 {<a name="l00555"></a>00555 CLUST clust;<a name="l00556"></a>00556 DWORD sector;<a name="l00557"></a>00557 BYTE c, n, *dptr;<a name="l00558"></a>00558 <a class="code" href="struct__FATFS.html">FATFS</a> *fs = FatFs;<a name="l00559"></a>00559 <a name="l00560"></a>00560 <a name="l00561"></a>00561 <span class="comment">/* Re-initialize directory object */</span><a name="l00562"></a>00562 clust = dirobj-><a class="code" href="struct__DIR.html#762e543e9001d96ae71c1a24f52a9759">sclust</a>;<a name="l00563"></a>00563 <span class="keywordflow">if</span> (clust) { <span class="comment">/* Dyanmic directory table */</span><a name="l00564"></a>00564 dirobj-><a class="code" href="struct__DIR.html#36b08a0927f70fb693aac83949ee19b8">clust</a> = clust;<a name="l00565"></a>00565 dirobj-><a class="code" href="struct__DIR.html#edba9551167ea52746b5f2c57ddce945">sect</a> = clust2sect(clust);<a name="l00566"></a>00566 } <span class="keywordflow">else</span> { <span class="comment">/* Static directory table */</span><a name="l00567"></a>00567 dirobj-><a class="code" href="struct__DIR.html#edba9551167ea52746b5f2c57ddce945">sect</a> = fs-><a class="code" href="struct__FATFS.html#3c1a4db83aea0aec5eed50b12c72da55">dirbase</a>;<a name="l00568"></a>00568 }<a name="l00569"></a>00569 dirobj-><a class="code" href="struct__DIR.html#036a031851bde1b63d85c59293412a8d">index</a> = 0;<a name="l00570"></a>00570 <a name="l00571"></a>00571 <span class="keywordflow">do</span> {<a name="l00572"></a>00572 <span class="keywordflow">if</span> (!move_window(dirobj-><a class="code" href="struct__DIR.html#edba9551167ea52746b5f2c57ddce945">sect</a>)) <span class="keywordflow">return</span> FR_RW_ERROR;<a name="l00573"></a>00573 dptr = &fs-><a class="code" href="struct__FATFS.html#32c85fa1d26f37661c21f5a1afaa2c08">win</a>[(dirobj-><a class="code" href="struct__DIR.html#036a031851bde1b63d85c59293412a8d">index</a> & 15) * 32]; <span class="comment">/* Pointer to the directory entry */</span><a name="l00574"></a>00574 c = dptr[DIR_Name];<a name="l00575"></a>00575 <span class="keywordflow">if</span> (c == 0 || c == 0xE5) { <span class="comment">/* Found an empty entry! */</span><a name="l00576"></a>00576 *dir = dptr; <span class="keywordflow">return</span> FR_OK;<a name="l00577"></a>00577 }<a name="l00578"></a>00578 } <span class="keywordflow">while</span> (next_dir_entry(dirobj)); <span class="comment">/* Next directory pointer */</span><a name="l00579"></a>00579 <span class="comment">/* Reached to end of the directory table */</span><a name="l00580"></a>00580 <a name="l00581"></a>00581 <span class="comment">/* Abort when static table or could not stretch dynamic table */</span><a name="l00582"></a>00582 <span class="keywordflow">if</span> (!clust || !(clust = create_chain(dirobj-><a class="code" href="struct__DIR.html#36b08a0927f70fb693aac83949ee19b8">clust</a>))) <span class="keywordflow">return</span> FR_DENIED;<a name="l00583"></a>00583 <span class="keywordflow">if</span> (clust == 1 || !move_window(0)) <span class="keywordflow">return</span> FR_RW_ERROR;<a name="l00584"></a>00584 <a name="l00585"></a>00585 fs-><a class="code" href="struct__FATFS.html#4d7990897697ab6b380e1036672d40a2">winsect</a> = sector = clust2sect(clust); <span class="comment">/* Cleanup the expanded table */</span><a name="l00586"></a>00586 memset(fs-><a class="code" href="struct__FATFS.html#32c85fa1d26f37661c21f5a1afaa2c08">win</a>, 0, 512);<a name="l00587"></a>00587 <span class="keywordflow">for</span> (n = fs-><a class="code" href="struct__FATFS.html#cf77b8f2c894bc68302efe617ed9e09e">sects_clust</a>; n; n--) {<a name="l00588"></a>00588 <span class="keywordflow">if</span> (<a class="code" href="mmc_8c.html#0045ef2f87f7c45d77bcdef38eae7b67">disk_write</a>(0, fs-><a class="code" href="struct__FATFS.html#32c85fa1d26f37661c21f5a1afa
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -