²Ù×÷ϵͳ¿Î³ÌÉè¼Æ ¼òµ¥ÎļþϵͳµÄʵÏÖ ÏÂÔØ±¾ÎÄ

²Ù×÷ϵͳ¿Î³ÌÉè¼Æ±¨¸æ

С×é±àºÅ£º С×é³ÉÔ±£º

Ò»¡¢¿Î³ÌÉè¼Æ¸ÅÊö£º

1¡¢ÌâÄ¿£º¼òµ¥ÎļþϵͳµÄʵÏÖ 2¡¢ÊµÏÖÄÚÈÝ

(1) ÔÚÄÚ´æÖпª±ÙÒ»¸öÐéÄâ´ÅÅ̿ռä×÷ΪÎļþ´æ´¢·ÖÇø£¬ÔÚÆäÉÏʵÏÖÒ»¸ö¼òµ¥µÄ»ùÓڶ༶Ŀ¼µÄµ¥Óû§µ¥ÈÎÎñϵͳÖеÄÎļþϵͳ¡£ÔÚÍ˳ö¸ÃÎļþϵͳµÄʹÓÃʱ£¬Ó¦½«¸ÃÐéÄâÎļþϵͳÒÔÒ»¸öWindows ÎļþµÄ·½Ê½±£´æµ½´ÅÅÌÉÏ£¬ÒÔ±ãÏ´οÉÒÔÔÙ½«Ëü»Ö¸´µ½ÄÚ´æµÄÐéÄâ´ÅÅ̿ռäÖС£

(2) Îļþ´æ´¢¿Õ¼äµÄ·ÖÅä¿É²ÉÓÃÏÔʽÁ´½Ó·ÖÅä»òÆäËûµÄ°ì·¨¡£

(3) ¿ÕÏдÅÅ̿ռäµÄ¹ÜÀí¿ÉÑ¡Ôñλʾͼ»òÆäËûµÄ°ì·¨¡£Èç¹û²ÉÓÃλʾͼÀ´¹ÜÀíÎļþ´æ´¢¿Õ¼ä£¬²¢²ÉÓÃÏÔʽÁ´½Ó·ÖÅ䷽ʽ£¬ÄÇô¿ÉÒÔ½«Î»Ê¾Í¼ºÏ²¢µ½FATÖС£

(4) ÎļþĿ¼½á¹¹²ÉÓö༶Ŀ¼½á¹¹¡£ÎªÁ˼òµ¥Æð¼û£¬¿ÉÒÔ²»Ê¹ÓÃË÷Òý½áµã£¬ÆäÖеÄÿ¸öĿ¼ÏîÓ¦°üº¬ÎļþÃû¡¢ÎïÀíµØÖ·¡¢³¤¶ÈµÈÐÅÏ¢£¬»¹¿ÉÒÔͨ¹ýĿ¼ÏîʵÏÖ¶ÔÎļþµÄ¶ÁºÍдµÄ±£»¤¡£

(5) ÒªÇóÌṩÒÔϲÙ×÷ÃüÁ

? my_format£º¶ÔÎļþ´æ´¢Æ÷½øÐиñʽ»¯£¬¼´°´ÕÕÎļþϵͳµÄ½á¹¹¶ÔÐéÄâ´ÅÅÌ¿Õ¼ä½øÐв¼¾Ö£¬²¢ÔÚÆäÉÏ´´½¨¸ùĿ¼ÒÔ¼°ÓÃÓÚ¹ÜÀíÎļþ´æ´¢¿Õ¼äµÈµÄÊý¾Ý½á¹¹¡£

? my_mkdir£ºÓÃÓÚ´´½¨×ÓĿ¼¡£ ? my_rmdir£ºÓÃÓÚɾ³ý×ÓĿ¼¡£ ? my_ls£ºÓÃÓÚÏÔʾĿ¼ÖеÄÄÚÈÝ¡£ ? my_cd£ºÓÃÓÚ¸ü¸Äµ±Ç°Ä¿Â¼¡£ ? my_create£ºÓÃÓÚ´´½¨Îļþ¡£ ? my_open£ºÓÃÓÚ´ò¿ªÎļþ¡£ ? my_close£ºÓÃÓڹرÕÎļþ¡£ ? my_write£ºÓÃÓÚдÎļþ¡£ ? my_read£ºÓÃÓÚ¶ÁÎļþ¡£ ? my_rm£ºÓÃÓÚɾ³ýÎļþ¡£

? my_exitsys£ºÓÃÓÚÍ˳öÎļþϵͳ¡£

¶þ¡¢Éè¼ÆË¼Â·£¨Ö÷ÒªËã·¨ÃèÊö¡¢³ÌÐòÁ÷³ÌͼµÈ£©£º 1£®ÏµÍ³Ö÷º¯Êýmain() £¨1£©¶ÔÓ¦ÃüÁÎÞ £¨2£©ÃüÁîµ÷Óøñʽ£ºÎÞ

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºvoid main() £¨4£©¹¦ÄÜ£ºÏµÍ³Ö÷º¯Êý £¨5£©ÊäÈ룺ÎÞ £¨6£©Êä³ö£ºÎÞ

£¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù ¶ÔÇ°Ãæ¶¨ÒåµÄÈ«¾Ö±äÁ¿½øÐгõʼ»¯£» ¢Ú µ÷ÓÃstartsys()½øÈëÎļþϵͳ£»

¢Û ÁгöÎļþϵͳÌṩµÄ¸÷ÏÄܼ°ÃüÁîµ÷Óøñʽ£» ¢Ü ÏÔʾÃüÁîÐÐÌáʾ·û£¬µÈ´ýÓû§ÊäÈëÃüÁ ¢Ý ½«Óû§ÊäÈëµÄÃüÁî±£´æµ½Ò»¸öbufÖУ»

¢Þ ¶ÔbufÖеÄÄÚÈݽøÐÐÃüÁî½âÎö£¬²¢µ÷ÓÃÏàÓ¦µÄº¯ÊýÖ´ÐÐÓû§¼üÈëµÄÃüÁ ¢ß Èç¹ûÃüÁî²»ÊÇ¡°my_exitsys¡±£¬ÔòÃüÁîÖ´ÐÐÍê±Ïºóת¢Ü¡£ 2. ½øÈëÎļþϵͳº¯Êýstartsys() £¨1£©¶ÔÓ¦ÃüÁÎÞ £¨2£©ÃüÁîµ÷Óøñʽ£ºÎÞ

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºvoid startsys()

£¨4£©¹¦ÄÜ£ºÓÉmain()º¯Êýµ÷Ó㬽øÈë²¢³õʼ»¯ÎÒÃÇËù½¨Á¢µÄÎļþϵͳ£¬ÒÔ¹©Óû§Ê¹Óᣠ£¨5£©ÊäÈ룺ÎÞ £¨6£©Êä³ö£ºÎÞ¡£

£¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º ¢Ù ÉêÇëÐéÄâ´ÅÅ̿ռ䣻

¢Ú ʹÓÃcÓïÑԵĿ⺯Êýfopen()´ò¿ªmyfsysÎļþ£ºÈôÎļþ´æÔÚ£¬Ôòת¢Û£»ÈôÎļþ²»´æÔÚ£¬Ôò´´½¨Ö®£¬×ª¢Ý

¢Û ʹÓÃcÓïÑԵĿ⺯Êýfread()¶ÁÈëmyfsysÎļþÄÚÈݵ½Óû§¿Õ¼äÖеÄÒ»¸ö»º³åÇøÖУ¬²¢ÅÐ¶ÏÆä¿ªÊ¼µÄ8¸ö×Ö½ÚÄÚÈÝÊÇ·ñΪ¡°10101010¡±£¨ÎļþϵͳħÊý£©£¬Èç¹ûÊÇ£¬Ôòת¢Ü£»·ñÔòת¢Ý£»

¢Ü ½«ÉÏÊö»º³åÇøÖеÄÄÚÈݸ´ÖƵ½ÄÚ´æÖеÄÐéÄâ´ÅÅ̿ռäÖУ»×ª¢ß

¢Ý ÔÚÆÁÄ»ÉÏÏÔʾ¡°myfsysÎļþϵͳ²»´æÔÚ£¬ÏÖÔÚ¿ªÊ¼´´½¨Îļþϵͳ¡±ÐÅÏ¢£¬²¢µ÷ÓÃmy_format()¶Ô¢ÙÖÐÉêÇëµ½µÄÐéÄâ´ÅÅÌ¿Õ¼ä½øÐиñʽ»¯²Ù×÷¡£×ª¢Þ£» ¢Þ ½«ÐéÄâ´ÅÅÌÖеÄÄÚÈݱ£´æµ½myfsysÎļþÖУ»×ª¢ß ¢ß ʹÓÃcÓïÑԵĿ⺯Êýfclose()¹Ø±ÕmyfsysÎļþ£»

¢à ³õʼ»¯Óû§´ò¿ªÎļþ±í£¬½«±íÏî0·ÖÅ䏸¸ùĿ¼ÎļþʹÓ㬲¢Ìîд¸ùĿ¼ÎļþµÄÏà¹ØÐÅÏ¢£¬ÓÉÓÚ¸ùĿ¼ûÓÐÉϼ¶Ä¿Â¼£¬ËùÒÔ±íÏîÖеÄdirnoºÍdiroff·Ö±ðÖÃΪ5£¨¸ùĿ¼ËùÔÚÆðʼ¿éºÅ£©ºÍ0£»²¢½«ptrcurdirÖ¸ÕëÖ¸Ïò¸ÃÓû§´ò¿ªÎļþ±íÏî¡£ ¢á ½«µ±Ç°Ä¿Â¼ÉèÖÃΪ¸ùĿ¼¡£ 3£®´ÅÅ̸ñʽ»¯º¯Êýmy_format() £¨1£©¶ÔÓ¦ÃüÁmy_format

£¨2£©ÃüÁîµ÷Óøñʽ£ºmy_format

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºvoid my_format()

£¨4£©¹¦ÄÜ£º¶ÔÐéÄâ´ÅÅ̽øÐиñʽ»¯£¬²¼¾ÖÐéÄâ´ÅÅÌ£¬½¨Á¢¸ùĿ¼Îļþ£¨»ò¸ùÄ¿Â¼Çø£©¡£ £¨5£©ÊäÈ룺ÎÞ £¨6£©Êä³ö£ºÎÞ¡£

£¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù ½«ÐéÄâ´ÅÅ̵ÚÒ»¸ö¿é×÷ΪÒýµ¼¿é£¬¿ªÊ¼µÄ8¸ö×Ö½ÚÊÇÎļþϵͳµÄħÊý£¬¼ÇΪ¡°10101010¡±£»ÔÚÖ®ºóдÈëÎļþϵͳµÄÃèÊöÐÅÏ¢£¬ÈçFAT±í´óС¼°Î»ÖᢸùĿ¼´óС¼°Î»Öá¢ÅÌ¿é´óС¡¢ÅÌ¿éÊýÁ¿¡¢Êý¾ÝÇø¿ªÊ¼Î»ÖõÈÐÅÏ¢£»

¢Ú ÔÚÒýµ¼¿éºó½¨Á¢Á½ÕÅÍêȫһÑùµÄFAT±í£¬ÓÃÓڼǼÎļþËùÕ¼¾ÝµÄ´ÅÅ̿鼰¹ÜÀíÐéÄâ´ÅÅÌ¿éµÄ·ÖÅ䣬ÿ¸öFATÕ¼¾ÝÁ½¸ö´ÅÅ̿飻¶ÔÓÚÿ¸öFATÖУ¬Ç°Ãæ5¸ö¿éÉèÖÃΪÒÑ·ÖÅ䣬ºóÃæ995¸ö¿éÉèÖÃΪ¿ÕÏУ»

¢Û ÔÚµÚ¶þÕÅFATºó´´½¨¸ùĿ¼Îļþroot£¬½«Êý¾ÝÇøµÄµÚ1¿é£¨¼´ÐéÄâ´ÅÅ̵ĵÚ6¿é£©·ÖÅ䏸¸ùĿ¼Îļþ£¬ÔڸôÅÅÌÉÏ´´½¨Á½¸öÌØÊâµÄĿ¼Ï¡°.¡±ºÍ¡°..¡±£¬ÆäÄÚÈݳýÁËÎļþÃû²»Í¬Ö®

Í⣬ÆäËû×Ö¶ÎÍêÈ«Ïàͬ¡£ 4£®¸ü¸Äµ±Ç°Ä¿Â¼º¯Êýmy_cd() £¨1£©¶ÔÓ¦ÃüÁmy_cd

£¨2£©ÃüÁîµ÷Óøñʽ£ºmy_cd dirname

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºvoid my_cd(char *dirname)

£¨4£©¹¦ÄÜ£º¸Ä±äµ±Ç°Ä¿Â¼µ½Ö¸¶¨µÄÃûΪdirnameµÄĿ¼¡£ £¨5£©ÊäÈ룺

dirname£ºÐµĵ±Ç°Ä¿Â¼µÄĿ¼Ãû£» £¨6£©Êä³ö£ºÎÞ

£¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù µ÷ÓÃmy_open()´ò¿ªÖ¸¶¨Ä¿Â¼ÃûµÄ¸¸Ä¿Â¼Îļþ£¬²¢µ÷ÓÃdo_read()¶ÁÈë¸Ã¸¸Ä¿Â¼ÎļþÄÚÈݵ½ÄÚ´æÖУ»

¢Ú ÔÚ¸¸Ä¿Â¼ÎļþÖмì²éеĵ±Ç°Ä¿Â¼ÃûÊÇ·ñ´æÔÚ£¬Èç¹û´æÔÚÔòת¢Û£¬·ñÔò·µ»Ø£¬²¢ÏÔʾ³ö´íÐÅÏ¢£»

¢Û µ÷ÓÃmy_close()¹Ø±Õ¢ÙÖдò¿ªµÄ¸¸Ä¿Â¼Îļþ£» ¢Ü µ÷ÓÃmy_close()¹Ø±ÕÔ­µ±Ç°Ä¿Â¼Îļþ£»

¢Ý Èç¹ûеĵ±Ç°Ä¿Â¼ÎļþûÓдò¿ª£¬Ôò´ò¿ª¸ÃĿ¼Îļþ£»²¢½«ptrcurdirÖ¸Ïò¸Ã´ò¿ªÎļþ±íÏ

¢Þ ÉèÖõ±Ç°Ä¿Â¼Îª¸ÃĿ¼¡£ 5£®´´½¨×ÓĿ¼º¯Êýmy_mkdir() £¨1£©¶ÔÓ¦ÃüÁmy_mkdir

£¨2£©ÃüÁîµ÷Óøñʽ£ºmy_ mkdir dirname

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºvoid my_mkdir(char *dirname) £¨4£©¹¦ÄÜ£ºÔÚµ±Ç°Ä¿Â¼Ï´´½¨ÃûΪdirnameµÄ×ÓĿ¼¡£ £¨5£©ÊäÈ룺

dirname£ºÐ½¨Ä¿Â¼µÄĿ¼Ãû¡£ £¨6£©Êä³ö£ºÎÞ¡£

£¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù µ÷ÓÃdo_read()¶ÁÈ뵱ǰĿ¼ÎļþÄÚÈݵ½Äڴ棬¼ì²éµ±Ç°Ä¿Â¼ÏÂн¨Ä¿Â¼ÎļþÊÇ·ñÖØÃû£¬ÈôÖØÃûÔò·µ»Ø£¬²¢ÏÔʾ´íÎóÐÅÏ¢£»

¢Ú Ϊн¨×ÓĿ¼Îļþ·ÖÅäÒ»¸ö¿ÕÏдò¿ªÎļþ±íÏÈç¹ûûÓпÕÏбíÏîÔò·µ»Ø-1£¬²¢ÏÔʾ´íÎóÐÅÏ¢£»

¢Û ¼ì²éFATÊÇ·ñÓпÕÏеÄÅ̿飬ÈçÓÐÔòΪн¨Ä¿Â¼Îļþ·ÖÅäÒ»¸öÅ̿飬·ñÔòÊÍ·Å¢ÙÖзÖÅäµÄ´ò¿ªÎļþ±íÏ·µ»Ø£¬²¢ÏÔʾ´íÎóÐÅÏ¢£»

¢Ü ÔÚµ±Ç°Ä¿Â¼ÖÐΪн¨Ä¿Â¼ÎļþѰÕÒÒ»¸ö¿ÕÏеÄĿ¼Ïî»òΪÆä×·¼ÓÒ»¸öеÄĿ¼Ïî;ÐèÐ޸ĵ±Ç°Ä¿Â¼ÎļþµÄ³¤¶ÈÐÅÏ¢£¬²¢½«µ±Ç°Ä¿Â¼ÎļþµÄÓû§´ò¿ªÎļþ±íÏîÖеÄfcbstateÖÃΪ1£» ¢Ý ×¼±¸ºÃн¨Ä¿Â¼ÎļþµÄFCBµÄÄÚÈÝ£¬ÎļþµÄÊôÐÔΪĿ¼Îļþ£¬ÒÔ¸²¸Çд·½Ê½µ÷ÓÃdo_write()½«ÆäÌîдµ½¶ÔÓ¦µÄ¿ÕĿ¼ÏîÖУ»

¢Þ ÔÚн¨Ä¿Â¼ÎļþËù·ÖÅäµ½µÄ´ÅÅÌ¿éÖн¨Á¢Á½¸öÌØÊâµÄĿ¼Ïî¡°.¡±ºÍ¡°..¡±Ä¿Â¼Ï·½·¨ÊÇ£ºÊ×ÏÈÔÚÓû§¿Õ¼äÖÐ×¼±¸ºÃÄÚÈÝ£¬È»ºóÒԽضÏд»òÕ߸²¸Çд·½Ê½µ÷ÓÃdo_write()½«Æäдµ½¢ÛÖзÖÅäµ½µÄ´ÅÅÌ¿éÖУ» ¢ß ·µ»Ø¡£

6£®É¾³ý×ÓĿ¼º¯Êýrmdir() £¨1£©¶ÔÓ¦ÃüÁmy_ rmdir

£¨2£©ÃüÁîµ÷Óøñʽ£ºmy_ rmdir dirname

£¨1£©º¯ÊýÉè¼Æ¸ñʽ£ºvoid my_rmdir(char *dirname) £¨2£©¹¦ÄÜ£ºÔÚµ±Ç°Ä¿Â¼ÏÂɾ³ýÃûΪdirnameµÄ×ÓĿ¼¡£ £¨3£©ÊäÈ룺

dirname£ºÓûɾ³ýĿ¼µÄĿ¼Ãû¡£ £¨4£©Êä³ö£ºÎÞ¡£

£¨5£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù µ÷ÓÃdo_read()¶ÁÈ뵱ǰĿ¼ÎļþÄÚÈݵ½Äڴ棬¼ì²éµ±Ç°Ä¿Â¼ÏÂÓûɾ³ýĿ¼ÎļþÊÇ·ñ´æÔÚ£¬Èô²»´æÔÚÔò·µ»Ø£¬²¢ÏÔʾ´íÎóÐÅÏ¢£»

¢Ú ¼ì²éÓûɾ³ýĿ¼ÎļþÊÇ·ñΪ¿Õ£¨³ýÁË¡°.¡±ºÍ¡°..¡±ÍâûÓÐÆäËû×ÓĿ¼ºÍÎļþ£©£¬¿É¸ù¾ÝÆäĿ¼ÏîÖмǼµÄÎļþ³¤¶ÈÀ´Åжϣ¬Èô²»Îª¿ÕÔò·µ»Ø£¬²¢ÏÔʾ´íÎóÐÅÏ¢£» ¢Û ¼ì²é¸ÃĿ¼ÎļþÊÇ·ñÒѾ­´ò¿ª£¬ÈôÒÑ´ò¿ªÔòµ÷ÓÃmy_close()¹Ø±Õµô£» ¢Ü »ØÊÕ¸ÃĿ¼ÎļþËùÕ¼¾ÝµÄ´ÅÅ̿飬ÐÞ¸ÄFAT£»

¢Ý ´Óµ±Ç°Ä¿Â¼ÎļþÖÐÇå¿Õ¸ÃĿ¼ÎļþµÄĿ¼ÏÇÒfree×Ö¶ÎÖÃΪ0£ºÒÔ¸²¸Çд·½Ê½µ÷ÓÃdo_write()À´ÊµÏÖ£»

¢Þ Ð޸ĵ±Ç°Ä¿Â¼ÎļþµÄÓû§´ò¿ª±íÏîÖеij¤¶ÈÐÅÏ¢£¬²¢½«±íÏîÖеÄfcbstateÖÃΪ1£» ¢ß ·µ»Ø¡£

7£®ÏÔʾĿ¼º¯Êýmy_ls() £¨1£©¶ÔÓ¦ÃüÁmy_ls

£¨2£©ÃüÁîµ÷Óøñʽ£ºmy_ls

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºvoid my_ls(void)

£¨4£©¹¦ÄÜ£ºÏÔʾµ±Ç°Ä¿Â¼µÄÄÚÈÝ£¨×ÓĿ¼ºÍÎļþÐÅÏ¢£©¡£ £¨5£©ÊäÈ룺ÎÞ £¨6£©Êä³ö£ºÎÞ

£¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù µ÷ÓÃdo_read()¶Á³öµ±Ç°Ä¿Â¼ÎļþÄÚÈݵ½Äڴ棻

¢Ú ½«¶Á³öµÄĿ¼ÎļþµÄÐÅÏ¢°´ÕÕÒ»¶¨µÄ¸ñʽÏÔʾµ½ÆÁÄ»ÉÏ£» ¢Û ·µ»Ø¡£

8£®´´½¨Îļþº¯Êýmy_create() £¨1£©¶ÔÓ¦ÃüÁmy_create

£¨2£©ÃüÁîµ÷Óøñʽ£ºmy_create filename

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºint my_create (char *filename) £¨4£©¹¦ÄÜ£º´´½¨ÃûΪfilenameµÄÐÂÎļþ¡£ £¨5£©ÊäÈ룺

filename£ºÐ½¨ÎļþµÄÎļþÃû£¬¿ÉÄܰüº¬Â·¾¶¡£

£¨6£©Êä³ö£ºÈô´´½¨³É¹¦£¬·µ»Ø¸ÃÎļþµÄÎļþÃèÊö·û£¨Îļþ´ò¿ª±íÖеÄÊý×éϱ꣩£»·ñÔò·µ»Ø-1¡£

£¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù ΪÐÂÎļþ·ÖÅäÒ»¸ö¿ÕÏдò¿ªÎļþ±íÏÈç¹ûûÓпÕÏбíÏîÔò·µ»Ø-1£¬²¢ÏÔʾ´íÎóÐÅÏ¢£» ¢Ú ÈôÐÂÎļþµÄ¸¸Ä¿Â¼Îļþ»¹Ã»Óдò¿ª£¬Ôòµ÷ÓÃmy_open()´ò¿ª£»Èô´ò¿ªÊ§°Ü£¬ÔòÊÍ·Å¢ÙÖÐΪн¨Îļþ·ÖÅäµÄ¿ÕÏÐÎļþ´ò¿ª±íÏ·µ»Ø-1£¬²¢ÏÔʾ´íÎóÐÅÏ¢£» ¢Û µ÷ÓÃdo_read()¶Á³ö¸Ã¸¸Ä¿Â¼ÎļþÄÚÈݵ½Äڴ棬¼ì²é¸ÃĿ¼ÏÂÐÂÎļþÊÇ·ñÖØÃû£¬ÈôÖØÃûÔòÊÍ·Å¢ÙÖзÖÅäµÄ´ò¿ªÎļþ±íÏ²¢µ÷ÓÃmy_close()¹Ø±Õ¢ÚÖдò¿ªµÄĿ¼Îļþ£»È»ºó·µ»Ø-1£¬²¢ÏÔʾ´íÎóÐÅÏ¢£»

¢Ü ¼ì²éFATÊÇ·ñÓпÕÏеÄÅ̿飬ÈçÓÐÔòΪÐÂÎļþ·ÖÅäÒ»¸öÅ̿飬·ñÔòÊÍ·Å¢ÙÖзÖÅäµÄ´ò¿ªÎļþ±íÏ²¢µ÷ÓÃmy_close()¹Ø±Õ¢ÚÖдò¿ªµÄĿ¼Îļþ£»·µ»Ø-1£¬²¢ÏÔʾ´íÎóÐÅÏ¢£»

¢Ý ÔÚ¸¸Ä¿Â¼ÖÐΪÐÂÎļþѰÕÒÒ»¸ö¿ÕÏеÄĿ¼Ïî»òΪÆä×·¼ÓÒ»¸öеÄĿ¼Ïî;ÐèÐ޸ĸÃĿ¼ÎļþµÄ³¤¶ÈÐÅÏ¢£¬²¢½«¸ÃĿ¼ÎļþµÄÓû§´ò¿ªÎļþ±íÏîÖеÄfcbstateÖÃΪ1£»

¢Þ ×¼±¸ºÃÐÂÎļþµÄFCBµÄÄÚÈÝ£¬ÎļþµÄÊôÐÔΪÊý¾ÝÎļþ£¬³¤¶ÈΪ0£¬ÒÔ¸²¸Çд·½Ê½µ÷ÓÃdo_write()½«ÆäÌîдµ½¢ÝÖзÖÅäµ½µÄ¿ÕĿ¼ÏîÖУ»

¢ß ΪÐÂÎļþÌîд¢ÙÖзÖÅäµ½µÄ¿ÕÏдò¿ªÎļþ±íÏfcbstate×Ö¶ÎֵΪ0£¬¶ÁдָÕëֵΪ0£» ¢à µ÷ÓÃmy_close()¹Ø±Õ¢ÚÖдò¿ªµÄ¸¸Ä¿Â¼Îļþ£»

¢á ½«ÐÂÎļþµÄ´ò¿ªÎļþ±íÏîÐòºÅ×÷ΪÆäÎļþÃèÊö·û·µ»Ø¡£ 9£®É¾³ýÎļþº¯Êýmy_rm() £¨1£©¶ÔÓ¦ÃüÁmy_rm

£¨2£©ÃüÁîµ÷Óøñʽ£ºmy_rm filename

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºvoid my_rm(char *filename) £¨4£©¹¦ÄÜ£ºÉ¾³ýÃûΪfilenameµÄÎļþ¡£ £¨5£©ÊäÈ룺

filename£ºÓûɾ³ýÎļþµÄÎļþÃû£¬¿ÉÄÜ»¹°üº¬Â·¾¶¡£ £¨6£©Êä³ö£ºÎÞ¡£

£¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù ÈôÓûɾ³ýÎļþµÄ¸¸Ä¿Â¼Îļþ»¹Ã»Óдò¿ª£¬Ôòµ÷ÓÃmy_open()´ò¿ª£»Èô´ò¿ªÊ§°Ü£¬Ôò·µ»Ø£¬²¢ÏÔʾ´íÎóÐÅÏ¢£»

¢Ú µ÷ÓÃdo_read()¶Á³ö¸Ã¸¸Ä¿Â¼ÎļþÄÚÈݵ½Äڴ棬¼ì²é¸ÃĿ¼ÏÂÓûɾ³ýÎļþÊÇ·ñ´æÔÚ£¬Èô²»´æÔÚÔò·µ»Ø£¬²¢ÏÔʾ´íÎóÐÅÏ¢£»

¢Û ¼ì²é¸ÃÎļþÊÇ·ñÒѾ­´ò¿ª£¬ÈôÒÑ´ò¿ªÔò¹Ø±Õµô£» ¢Ü »ØÊÕ¸ÃÎļþËùÕ¼¾ÝµÄ´ÅÅ̿飬ÐÞ¸ÄFAT£»

¢Ý ´ÓÎļþµÄ¸¸Ä¿Â¼ÎļþÖÐÇå¿Õ¸ÃÎļþµÄĿ¼ÏÇÒfree×Ö¶ÎÖÃΪ0£ºÒÔ¸²¸Çд·½Ê½µ÷ÓÃdo_write()À´ÊµÏÖ£»£»

¢Þ Ð޸ĸø¸Ä¿Â¼ÎļþµÄÓû§´ò¿ªÎļþ±íÏîÖеij¤¶ÈÐÅÏ¢£¬²¢½«¸Ã±íÏîÖеÄfcbstateÖÃΪ1£» ¢ß ·µ»Ø¡£

10£®´ò¿ªÎļþº¯Êýmy_open() £¨1£©¶ÔÓ¦ÃüÁmy_open

£¨2£©ÃüÁîµ÷Óøñʽ£ºmy_open filename

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºint my_open(char *filename) £¨4£©¹¦ÄÜ£º´ò¿ªµ±Ç°Ä¿Â¼ÏÂÃûΪfilenameµÄÎļþ¡£ £¨5£©ÊäÈ룺

filename£ºÓû´ò¿ªÎļþµÄÎļþÃû

£¨6£©Êä³ö£ºÈô´ò¿ª³É¹¦£¬·µ»Ø¸ÃÎļþµÄÃèÊö·û£¨ÔÚÓû§´ò¿ªÎļþ±íÖбíÏîÐòºÅ£©£»·ñÔò·µ»Ø-1¡£

£¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù ¼ì²é¸ÃÎļþÊÇ·ñÒѾ­´ò¿ª£¬ÈôÒÑ´ò¿ªÔò·µ»Ø-1£¬²¢ÏÔʾ´íÎóÐÅÏ¢£» ¢Ú µ÷ÓÃdo_read()¶Á³ö¸¸Ä¿Â¼ÎļþµÄÄÚÈݵ½Äڴ棬¼ì²é¸ÃĿ¼ÏÂÓû´ò¿ªÎļþÊÇ·ñ´æÔÚ£¬Èô²»´æÔÚÔò·µ»Ø-1£¬²¢ÏÔʾ´íÎóÐÅÏ¢£»

¢Û ¼ì²éÓû§´ò¿ªÎļþ±íÖÐÊÇ·ñÓпձíÏÈôÓÐÔòΪÓû´ò¿ªÎļþ·ÖÅäÒ»¸ö¿Õ±íÏÈôûÓÐÔò·µ»Ø-1£¬²¢ÏÔʾ´íÎóÐÅÏ¢£»

¢Ü Ϊ¸ÃÎļþÌîд¿Õ°×Óû§´ò¿ªÎļþ±í±íÏîÄÚÈÝ£¬¶ÁдָÕëÖÃΪ0£»

¢Ý ½«¸ÃÎļþËù·ÖÅäµ½µÄ¿Õ°×Óû§´ò¿ªÎļþ±í±íÏîÐòºÅ£¨Êý×éϱ꣩×÷ΪÎļþÃèÊö·ûfd·µ»Ø¡£ 11£®¹Ø±ÕÎļþº¯Êýmy_close() £¨1£©¶ÔÓ¦ÃüÁmy_close

£¨2£©ÃüÁîµ÷Óøñʽ£ºmy_close fd

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºvoid my_close(int fd)

£¨4£©¹¦ÄÜ£º¹Ø±ÕÇ°ÃæÓÉmy_open()´ò¿ªµÄÎļþÃèÊö·ûΪfdµÄÎļþ¡£ £¨5£©ÊäÈ룺

fd£ºÎļþÃèÊö·û¡£ £¨6£©Êä³ö£ºÎÞ¡£

£¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù ¼ì²éfdµÄÓÐЧÐÔ£¨fd²»Äܳ¬³öÓû§´ò¿ªÎļþ±íËùÔÚÊý×éµÄ×î´óϱ꣩£¬Èç¹ûÎÞЧÔò·µ»Ø-1£»

¢Ú ¼ì²éÓû§´ò¿ªÎļþ±í±íÏîÖеÄfcbstate×ֶεÄÖµ£¬Èç¹ûΪ1ÔòÐèÒª½«¸ÃÎļþµÄFCBµÄÄÚÈݱ£´æµ½ÐéÄâ´ÅÅÌÉϸÃÎļþµÄĿ¼ÏîÖУ¬·½·¨ÊÇ£º´ò¿ª¸ÃÎļþµÄ¸¸Ä¿Â¼Îļþ£¬ÒÔ¸²¸Çд·½Ê½µ÷ÓÃdo_write()½«Óû¹Ø±ÕÎļþµÄFCBдÈ븸Ŀ¼ÎļþµÄÏàÓ¦ÅÌ¿éÖУ» ¢Û »ØÊÕ¸ÃÎļþÕ¼¾ÝµÄÓû§´ò¿ªÎļþ±í±íÏ½øÐÐÇå¿Õ²Ù×÷£©£¬²¢½«topenfile×Ö¶ÎÖÃΪ0£» ¢Ü ·µ»Ø¡£

12£®Ð´Îļþº¯Êýmy_write() £¨1£©¶ÔÓ¦ÃüÁmy_write

£¨2£©ÃüÁîµ÷Óøñʽ£ºmy_write fd

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºint my_write(int fd)

£¨4£©¹¦ÄÜ£º½«Óû§Í¨¹ý¼üÅÌÊäÈëµÄÄÚÈÝдµ½fdËùÖ¸¶¨µÄÎļþÖС£´ÅÅÌÎļþµÄ¶Áд²Ù×÷¶¼±ØÐëÒÔÍêÕûµÄÊý¾Ý¿éΪµ¥Î»½øÐУ¬ÔÚд²Ù×÷ʱ£¬ÏȽ«Êý¾ÝдÔÚ»º³åÇøÖУ¬»º³åÇøµÄ´óСÓë´ÅÅÌ¿éµÄ´óСÏàͬ£¬È»ºóÔÙ½«»º³åÇøÖеÄÊý¾ÝÒ»´ÎÐÔдµ½´ÅÅÌ¿éÖУ»¶Á³öʱÏȽ«Ò»¸ö´ÅÅÌ¿éÖеÄÄÚÈݶÁµ½»º³åÇøÖУ¬È»ºóÔÙ´«Ë͵½Óû§Çø¡£±¾ÊµÀýΪÁ˼ò±ãÆð¼û£¬Ã»ÓÐÉèÖûº³åÇø¹ÜÀí£¬Ö»ÊÇÔÚ¶ÁдÎļþʱÓÉÓû§Ê¹ÓÃmalloc()ÉêÇëÒ»¿é¿Õ¼ä×÷Ϊ»º³åÇø£¬¶Áд²Ù×÷½áÊøºóʹÓÃfree()Êͷŵô¡£

д²Ù×÷³£ÓÐÈýÖÖ·½Ê½£º½Ø¶Ïд¡¢¸²¸ÇдºÍ×·¼Óд¡£½Ø¶ÏдÊÇ·ÅÆúÔ­À´ÎļþµÄÄÚÈÝ£¬ÖØÐÂдÎļþ£»¸²¸ÇдÊÇÐÞ¸ÄÎļþÔÚµ±Ç°¶ÁдָÕëËùÖ¸µÄλÖÿªÊ¼µÄ²¿·ÖÄÚÈÝ£»×·¼ÓдÊÇÔÚÔ­ÎļþµÄ×îºóÌí¼ÓеÄÄÚÈÝ¡£ÔÚ±¾ÊµÀýÖУ¬ÊäÈëдÎļþÃüÁîºó£¬ÏµÍ³»á³öÏÖÌáʾÈÃÓû§Ñ¡ÔñÆäÖеÄÒ»ÖÖд·½Ê½£¬²¢½«Ëæºó¼üÅÌÊäÈëµÄÄÚÈݰ´ÕÕËùÑ¡µÄ·½Ê½Ð´µ½ÎļþÖУ¬¼üÅÌÊäÈëÄÚÈÝͨ¹ýCTR+Z¼ü£¨»òÆäËûÉ趨µÄ¼ü£©½áÊø¡£ £¨5£©ÊäÈ룺

fd£º open()º¯ÊýµÄ·µ»ØÖµ£¬ÎļþµÄÃèÊö·û£» £¨6£©Êä³ö£ºÊµ¼ÊдÈëµÄ×Ö½ÚÊý¡£ £¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù ¼ì²éfdµÄÓÐЧÐÔ£¨fd²»Äܳ¬³öÓû§´ò¿ªÎļþ±íËùÔÚÊý×éµÄ×î´óϱ꣩£¬Èç¹ûÎÞЧÔò·µ»Ø-1£¬²¢ÏÔʾ³ö´íÐÅÏ¢£»

¢Ú Ìáʾ²¢µÈ´ýÓû§ÊäÈëд·½Ê½£º£¨1£º½Ø¶Ïд£»2£º¸²¸Çд£»3£º×·¼Óд£©

¢Û Èç¹ûÓû§ÒªÇóµÄд·½Ê½ÊǽضÏд£¬ÔòÊÍ·ÅÎļþ³ýµÚÒ»¿éÍâµÄÆäËû´ÅÅ̿ռäÄÚÈÝ£¨²éÕÒ²¢ÐÞ¸ÄFAT±í£©£¬½«ÄÚ´æÓû§´ò¿ªÎļþ±íÏîÖÐÎļþ³¤¶ÈÐÞ¸ÄΪ0£¬½«¶ÁдָÕëÖÃΪ0²¢×ª¢Ü£»Èç¹ûÓû§ÒªÇóµÄд·½Ê½ÊÇ×·¼Óд£¬ÔòÐÞ¸ÄÎļþµÄµ±Ç°¶ÁдָÕëλÖõ½ÎļþµÄĩ⣬²¢×ª¢Ü£»Èç¹ûд·½Ê½ÊǸ²¸Çд£¬ÔòÖ±½Óת¢Ü£»

¢Ü ÌáʾÓû§£ºÕû¸öÊäÈëÄÚÈÝͨ¹ýCTR+Z¼ü£¨»òÆäËûÉ趨µÄ¼ü£©½áÊø£»Óû§¿É·Ö¶à´ÎÊäÈë

дÈëÄÚÈÝ£¬Ã¿´ÎÓûسµ½áÊø£»

¢Ý µÈ´ýÓû§´Ó¼üÅÌÊäÈëÎļþÄÚÈÝ£¬²¢½«Óû§µÄ±¾´ÎÊäÈëÄÚÈݱ£´æµ½Ò»ÁÙʱ±äÁ¿text[]ÖУ¬ÒªÇóÿ´ÎÊäÈëÒԻسµ½áÊø£¬È«²¿½áÊøÓÃCTR+Z¼ü£¨»òÆäËûÉ趨µÄ¼ü£©£» ¢Þ µ÷ÓÃdo_write()º¯Êý½«Í¨¹ý¼üÅ̼üÈëµÄÄÚÈÝдµ½ÎļþÖС£

¢ß Èç¹ûdo_write()º¯ÊýµÄ·µ»ØÖµÎª·Ç¸ºÖµ£¬Ôò½«Êµ¼ÊдÈë×Ö½ÚÊýÔö¼Ódo_write()º¯Êý·µ»ØÖµ£¬·ñÔòÏÔʾ³ö´íÐÅÏ¢£¬²¢×ª¢á£»

¢à Èç¹ûtext[]ÖÐ×îºóÒ»¸ö×Ö·û²»ÊǽáÊø×Ö·ûCTR+Z£¬Ôòת¢ß¼ÌÐø½øÐÐд²Ù×÷£»·ñÔòת¢á£» ¢á Èç¹ûµ±Ç°¶ÁдָÕëλÖôóÓÚÓû§´ò¿ªÎļþ±íÏîÖеÄÎļþ³¤¶È£¬ÔòÐ޸Ĵò¿ªÎļþ±íÏîÖеÄÎļþ³¤¶ÈÐÅÏ¢£¬²¢½«fcbstateÖÃ1£» ¢â ·µ»ØÊµ¼ÊдÈëµÄ×Ö½ÚÊý¡£

13£®Êµ¼ÊдÎļþº¯Êýdo_write() £¨1£©¶ÔÓ¦ÃüÁÎÞ £¨2£©ÃüÁîµ÷Óøñʽ£ºÎÞ

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºint my_write(int fd£¬char *text£¬int len£¬char wstyle)

£¨4£©¹¦ÄÜ£º±»Ð´Îļþº¯Êýmy_write()µ÷Óã¬ÓÃÀ´½«¼üÅÌÊäÈëµÄÄÚÈÝдµ½ÏàÓ¦µÄÎļþÖÐÈ¥¡£ £¨5£©ÊäÈ룺

fd£º open()º¯ÊýµÄ·µ»ØÖµ£¬ÎļþµÄÃèÊö·û£» text£ºÖ¸ÏòҪдÈëµÄÄÚÈݵÄÖ¸Õ룻 len£º±¾´ÎÒªÇóдÈë×Ö½ÚÊý wstyle£ºÐ´·½Ê½

£¨6£©Êä³ö£ºÊµ¼ÊдÈëµÄ×Ö½ÚÊý¡£ £¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù ÓÃmalloc()ÉêÇë1024BµÄÄÚ´æ¿Õ¼ä×÷Ϊ¶Áд´ÅÅ̵Ļº³åÇøbuf£¬ÉêÇëʧ°ÜÔò·µ»Ø-1£¬²¢ÏÔʾ³ö´íÐÅÏ¢£»

¢Ú ½«¶ÁдָÕëת»¯ÎªÂß¼­¿é¿éºÅºÍ¿éÄÚÆ«ÒÆoff£¬²¢ÀûÓôò¿ªÎļþ±í±íÏîÖеÄÊ׿éºÅ¼°FAT±íµÄÏà¹ØÄÚÈݽ«Âß¼­¿é¿éºÅת»»³É¶ÔÓ¦µÄ´ÅÅÌ¿é¿éºÅblkno£»Èç¹ûÕÒ²»µ½¶ÔÓ¦µÄ´ÅÅ̿飬ÔòÐèÒª¼ìË÷FATΪ¸ÃÂß¼­¿é·ÖÅäһеĴÅÅ̿飬²¢½«¶ÔÓ¦µÄ´ÅÅÌ¿é¿éºÅblknoµÇ¼Çµ½FATÖУ¬Èô·ÖÅäʧ°Ü£¬Ôò·µ»Ø-1£¬²¢ÏÔʾ³ö´íÐÅÏ¢£» ¢Û Èç¹ûÊǸ²¸Çд£¬»òÕßÈç¹ûµ±Ç°¶ÁдָÕëËù¶ÔÓ¦µÄ¿éÄÚÆ«ÒÆoff²»µÈÓÚ0£¬Ôò½«¿éºÅΪblknoµÄÐéÄâ´ÅÅÌ¿éÈ«²¿1024BµÄÄÚÈݶÁµ½»º³åÇøbufÖУ»·ñÔò±ãÓÃASCIIÂë0Çå¿Õbuf£»

¢Ü ½«textÖÐδдÈëµÄÄÚÈÝÔÝ´æµ½»º³åÇøbuffµÄµÚoff×Ö½Ú¿ªÊ¼µÄλÖã¬Ö±µ½»º³åÇøÂú£¬»òÕß½ÓÊÕµ½½áÊø×Ö·ûCTR+ZΪֹ£»½«±¾´ÎдÈë×Ö½ÚÊý¼Ç¼µ½tmplenÖУ» ¢Ý ½«bufÖÐ1024BµÄÄÚÈÝдÈëµ½¿éºÅΪblknoµÄÐéÄâ´ÅÅÌ¿éÖУ»

¢Þ½«µ±Ç°¶ÁдָÕëÐÞ¸ÄΪԭÀ´µÄÖµ¼ÓÉÏtmplen£»²¢½«±¾´Îʵ¼ÊдÈëµÄ×Ö½ÚÊýÔö¼Ótmplen£» ¢ß Èç¹ûtmplenСÓÚlen£¬Ôòת¢Ú¼ÌÐøÐ´È룻·ñÔòת¢à£» ¢à ·µ»Ø±¾´Îʵ¼ÊдÈëµÄ×Ö½ÚÊý¡£ 14£®¶ÁÎļþº¯Êýmy_read() £¨1£©¶ÔÓ¦ÃüÁmy_read

£¨2£©ÃüÁîµ÷Óøñʽ£ºmy_read fd len

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºint myread (int fd, int len)

£¨4£©¹¦ÄÜ£º¶Á³öÖ¸¶¨ÎļþÖдӶÁдָÕ뿪ʼµÄ³¤¶ÈΪlenµÄÄÚÈݵ½Óû§¿Õ¼äÖС£ £¨5£©ÊäÈ룺

fd£º open()º¯ÊýµÄ·µ»ØÖµ£¬ÎļþµÄÃèÊö·û£» len: Òª´ÓÎļþÖжÁ³öµÄ×Ö½ÚÊý¡£

£¨6£©Êä³ö£ºÊµ¼Ê¶Á³öµÄ×Ö½ÚÊý¡£ £¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù ¶¨ÒåÒ»¸ö×Ö·ûÐÍÊý×étext[len]£¬ÓÃÀ´½ÓÊÕÓû§´ÓÎļþÖжÁ³öµÄÎļþÄÚÈÝ£» ¢Ú ¼ì²éfdµÄÓÐЧÐÔ£¨fd²»Äܳ¬³öÓû§´ò¿ªÎļþ±íËùÔÚÊý×éµÄ×î´óϱ꣩£¬Èç¹ûÎÞЧÔò·µ»Ø-1£¬²¢ÏÔʾ³ö´íÐÅÏ¢£»

¢Û µ÷ÓÃdo_read()½«Ö¸¶¨ÎļþÖеÄlen×Ö½ÚÄÚÈݶÁ³öµ½text[]ÖУ»

¢Ü Èç¹ûdo_read()µÄ·µ»ØÖµÎª¸º£¬ÔòÏÔʾ³ö´íÐÅÏ¢£»·ñÔò½«text[]ÖеÄÄÚÈÝÏÔʾµ½ÆÁÄ»ÉÏ£» ¢Ý ·µ»Ø¡£

15£®Êµ¼Ê¶ÁÎļþº¯Êýdo_read() £¨1£©¶ÔÓ¦ÃüÁÎÞ £¨2£©ÃüÁîµ÷Óøñʽ£ºÎÞ

£¨3£©º¯ÊýÉè¼Æ¸ñʽ£ºint do_read (int fd, int len,char *text)

£¨4£©¹¦ÄÜ£º±»my_read()µ÷Ó㬶Á³öÖ¸¶¨ÎļþÖдӶÁдָÕ뿪ʼµÄ³¤¶ÈΪlenµÄÄÚÈݵ½Óû§¿Õ¼äµÄtextÖС£ £¨5£©ÊäÈ룺

fd£º open()º¯ÊýµÄ·µ»ØÖµ£¬ÎļþµÄÃèÊö·û£» len: ÒªÇó´ÓÎļþÖжÁ³öµÄ×Ö½ÚÊý¡£ text£ºÖ¸Ïò´æ·Å¶Á³öÊý¾ÝµÄÓû§ÇøµØÖ· £¨6£©Êä³ö£ºÊµ¼Ê¶Á³öµÄ×Ö½ÚÊý¡£ £¨7£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù ʹÓÃmalloc()ÉêÇë1024B¿Õ¼ä×÷Ϊ»º³åÇøbuf£¬ÉêÇëʧ°ÜÔò·µ»Ø-1£¬²¢ÏÔʾ³ö´íÐÅÏ¢£» ¢Ú ½«¶ÁдָÕëת»¯ÎªÂß¼­¿é¿éºÅ¼°¿éÄÚÆ«ÒÆÁ¿off£¬ÀûÓôò¿ªÎļþ±í±íÏîÖеÄÊ׿éºÅ²éÕÒFAT±í£¬ÕÒµ½¸ÃÂß¼­¿éËùÔڵĴÅÅÌ¿é¿éºÅ£»½«¸Ã´ÅÅÌ¿é¿éºÅת»¯ÎªÐéÄâ´ÅÅÌÉϵÄÄÚ´æÎ»Öã» ¢Û ½«¸ÃÄÚ´æÎ»ÖÿªÊ¼µÄ1024B£¨Ò»¸ö´ÅÅ̿飩ÄÚÈݶÁÈëbufÖУ»

¢Ü ±È½ÏbufÖÐ´ÓÆ«ÒÆÁ¿off¿ªÊ¼µÄÊ£Óà×Ö½ÚÊýÊÇ·ñ´óÓÚµÈÓÚÓ¦¶ÁдµÄ×Ö½ÚÊýlen£¬Èç¹ûÊÇ£¬Ôò½«´Óoff¿ªÊ¼µÄbufÖеÄlen³¤¶ÈµÄÄÚÈݶÁÈëµ½text[]ÖУ»·ñÔò£¬½«´Óoff¿ªÊ¼µÄbufÖеÄÊ£ÓàÄÚÈݶÁÈëµ½text[]ÖУ»

¢Ý ½«¶ÁдָÕëÔö¼Ó¢ÜÖÐÒѶÁ×Ö½ÚÊý£¬½«Ó¦¶ÁдµÄ×Ö½ÚÊýlen¼õÈ¥¢ÜÖÐÒѶÁ×Ö½ÚÊý£¬Èôlen´óÓÚ0£¬Ôòת¢Ú£»·ñÔòת¢Þ£»

¢Þ ʹÓÃfree()ÊÍ·Å¢ÙÖÐÉêÇëµÄbuf¡£ ¢ß ·µ»ØÊµ¼Ê¶Á³öµÄ×Ö½ÚÊý¡£

16. Í˳öÎļþϵͳº¯Êýmy_exitsys() £¨1£©¶ÔÓ¦ÃüÁmy_exitsys

£¨2£©ÃüÁîµ÷Óøñʽ£ºmy_ exitsys

£¨1£©º¯ÊýÉè¼Æ¸ñʽ£ºvoid my_exitsys() £¨2£©¹¦ÄÜ£ºÍ˳öÎļþϵͳ¡£ £¨3£©ÊäÈ룺ÎÞ £¨4£©Êä³ö£ºÎÞ¡£

£¨5£©º¯ÊýÐèÍê³ÉµÄ¹¤×÷£º

¢Ù ʹÓÃC¿âº¯Êýfopen()´ò¿ª´ÅÅÌÉϵÄmyfsysÎļþ£»

¢Ú ½«ÐéÄâ´ÅÅ̿ռäÖеÄËùÓÐÄÚÈݱ£´æµ½´ÅÅÌÉϵÄmyfsysÎļþÖУ» ¢Û ʹÓÃcÓïÑԵĿ⺯Êýfclose()¹Ø±ÕmyfsysÎļþ£» ¢Ü ³·ÏúÓû§´ò¿ªÎļþ±í£¬ÊÍ·ÅÆäÄÚ´æ¿Õ¼ä ¢Ý ÊÍ·ÅÐéÄâ´ÅÅ̿ռ䡣

Á÷³Ìͼ

³ÌÐòÆô¶¯

¼þ ÎÄ Ïµ ÊÇ Í³ÊÇ·ñ

´æÔÚ

·ñ

´´½¨Îļþϵͳ£¬²¢¸ñʽ»¯

µÈ´ýÓû§ÃüÁîÊäÈë

Óû§ÊäÈë

ÃüÁî my_create my_ls my_rm my_open ??

Èý¡¢³ÌÐòʵÏÖ´úÂ룺 #include #include #include #include

¼ÓÔØÎļþϵͳ my_exitsys

#define BLOCKSIZE 1024 // ´ÅÅÌ¿é´óС #define SIZE 1024000 // ÐéÄâ´ÅÅ̿ռä´óС #define END 65535 // FATÖеÄÎļþ½áÊø±êÖ¾ #define FREE 0 // FATÖÐÅÌ¿é¿ÕÏбêÖ¾

#define ROOTBLOCKNUM 2 // ¸ùÄ¿Â¼ÇøËùÕ¼ÅÌ¿éÊý #define MAXOPENFILE 10 // ×î¶àͬʱ´ò¿ªÎļþ¸öÊýt #define MAXTEXT 10000

/* Îļþ¿ØÖÆ¿é */ typedef struct FCB{

char filename[8]; // ÎļþÃû char exname[3]; // ÎļþÀ©Õ¹Ãû

unsigned char attribute; // ÎļþÊôÐÔ×ֶΣ¬ÖµÎª0ʱ±íʾĿ¼Îļþ£¬ÖµÎª1ʱ±íʾÊý¾ÝÎļþ

unsigned short time; // Îļþ´´½¨Ê±¼ä unsigned short date; // Îļþ´´½¨ÈÕÆÚ unsigned short first; // ÎļþÆðʼÅÌ¿éºÅ unsigned long length; // Îļþ³¤¶È

char free; // ±íʾĿ¼ÏîÊÇ·ñΪ¿Õ£¬ÈôֵΪ0£¬±íʾ¿Õ£¬ÖµÎª1£¬±íʾÒÑ·ÖÅä }fcb;

/* Îļþ·ÖÅä±í */ typedef struct FAT {

unsigned short id; // ´ÅÅÌ¿éµÄ״̬£¨¿ÕÏеģ¬×îºóµÄ£¬ÏÂÒ»¸ö£© }fat;

/* Óû§´ò¿ªÎļþ±í */

typedef struct USEROPEN {

char filename[8]; // ÎļþÃû char exname[3]; // ÎļþÀ©Õ¹Ãû

unsigned char attribute;//ÎļþÊôÐÔ×ֶΣ¬ÖµÎª0ʱ±íʾĿ¼Îļþ£¬ÖµÎª1ʱ±íʾÊý¾ÝÎļþ

unsigned short time; // Îļþ´´½¨Ê±¼ä unsigned short date; // Îļþ´´½¨ÈÕÆÚ unsigned short first; // ÎļþÆðʼÅÌ¿éºÅ unsigned long length;//Îļþ³¤¶È£¨¶ÔÊý¾ÝÎļþÊÇ×Ö½ÚÊý£¬¶ÔĿ¼Îļþ¿ÉÒÔÊÇĿ¼Ïî¸öÊý£© char free; // ±íʾĿ¼ÏîÊÇ·ñΪ¿Õ£¬ÈôֵΪ0£¬±íʾ¿Õ£¬ÖµÎª1£¬±íʾÒÑ·ÖÅä

unsigned short dirno; // ÏàÓ¦´ò¿ªÎļþµÄĿ¼ÏîÔÚ¸¸Ä¿Â¼ÎļþÖеÄÅÌ¿éºÅ

int diroff; // ÏàÓ¦´ò¿ªÎļþµÄĿ¼ÏîÔÚ¸¸Ä¿Â¼ÎļþµÄdirnoÅÌ¿éÖеÄĿ¼ÏîÐòºÅ

char dir[80]; // ÏàÓ¦´ò¿ªÎļþËùÔڵķ¾¶Ãû£¬ÕâÑù·½±ã¿ìËÙ¼ì²é³öÖ¸¶¨ÎļþÊÇ·ñÒѾ­

´ò¿ª

int father; // ¸¸Ä¿Â¼ÔÚ´ò¿ªÎļþ±íÏîµÄλÖÃ

int count; // ¶ÁдָÕëÔÚÎļþÖеÄλÖÃ,ÎļþµÄ×Ü×Ö·ûÊý

char fcbstate; // ÊÇ·ñÐÞ¸ÄÁËÎļþµÄFCBµÄÄÚÈÝ£¬Èç¹ûÐÞ¸ÄÁËÖÃΪ1£¬·ñÔòΪ0

char topenfile; // ±íʾ¸ÃÓû§´ò¿ª±íÏîÊÇ·ñΪ¿Õ£¬ÈôֵΪ0£¬±íʾΪ¿Õ£¬·ñÔò±íʾÒѱ»Ä³´ò¿ªÎļþÕ¼¾Ý }useropen;

/* Òýµ¼¿é */

typedef struct BLOCK0 {

char magic[10]; // ÎļþϵͳħÊý

char information[200];//´æ´¢Ò»Ð©ÃèÊöÐÅÏ¢£¬Èç´ÅÅÌ¿é´óС¡¢´ÅÅÌ¿éÊýÁ¿¡¢×î¶à´ò¿ªÎļþÊýµÈ

unsigned short root; // ¸ùĿ¼ÎļþµÄÆðʼÅÌ¿éºÅ

unsigned char *startblock; // ÐéÄâ´ÅÅÌÉÏÊý¾ÝÇø¿ªÊ¼Î»Öà }block0;

unsigned char *myvhard; // Ö¸ÏòÐéÄâ´ÅÅÌµÄÆðʼµØÖ·

useropen openfilelist[MAXOPENFILE]; // Óû§´ò¿ªÎļþ±íÊý×é

int curdir; // Óû§´ò¿ªÎļþ±íÖеĵ±Ç°Ä¿Â¼ËùÔÚ´ò¿ªÎļþ±íÏîµÄλÖà char currentdir[80]; // ¼Ç¼µ±Ç°Ä¿Â¼µÄĿ¼Ãû£¨°üÀ¨Ä¿Â¼µÄ·¾¶£© unsigned char* startp; // ¼Ç¼ÐéÄâ´ÅÅÌÉÏÊý¾ÝÇø¿ªÊ¼Î»Öà char myfilename[] = \ÎļþϵͳµÄÎļþÃû

void startsys(); // ½øÈëÎļþϵͳ void my_format(); // ´ÅÅ̸ñʽ»¯

void my_cd(char *dirname); // ¸ü¸Äµ±Ç°Ä¿Â¼ void my_mkdir(char *dirname); // ´´½¨×ÓĿ¼ void my_rmdir(char *dirname); // ɾ³ý×ÓĿ¼ void my_ls(); // ÏÔʾĿ¼

void my_create (char *filename); // ´´½¨Îļþ void my_rm(char *filename); // ɾ³ýÎļþ int my_open(char *filename); // ´ò¿ªÎļþ int my_close(int fd); // ¹Ø±ÕÎļþ int my_write(int fd); // дÎļþ

int do_write(int fd, char *text, int len, char wstyle); // ʵ¼ÊдÎļþ int my_read (int fd, int len); // ¶ÁÎļþ

int do_read (int fd, int len,char *text); // ʵ¼Ê¶ÁÎļþ void my_exitsys(); // Í˳öÎļþϵͳ

unsigned short findblock(); // ѰÕÒ¿ÕÏÐÅÌ¿é int findopenfile(); // ѰÕÒ¿ÕÏÐÎļþ±íÏî void startsys() {

FILE *fp;

unsigned char buf[SIZE]; fcb *root; int i;

myvhard = (unsigned char *)malloc(SIZE);//ÉêÇëÐéÄâ´ÅÅ̿ռä

memset(myvhard, 0, SIZE);//½«myvhardÖÐǰSIZE¸ö×Ö½ÚÓà 0 Ìæ»»²¢·µ»Ø myvhard if((fp = fopen(myfilename, \ {

fread(buf, SIZE, 1, fp);//½«¶þ½øÖÆÎļþ¶ÁÈ¡µ½»º³åÇø fclose(fp);

if(strcmp(((block0 *)buf)->magic, \ {

printf(\ my_format(); } else {

for(i = 0; i < SIZE; i++) myvhard[i] = buf[i]; } } else {

printf(\ my_format(); }

root = (fcb *)(myvhard + 5 * BLOCKSIZE); strcpy(openfilelist[0].filename, root->filename); strcpy(openfilelist[0].exname, root->exname); openfilelist[0].attribute = root->attribute; openfilelist[0].time = root->time; openfilelist[0].date = root->date; openfilelist[0].first = root->first; openfilelist[0].length = root->length; openfilelist[0].free = root->free; openfilelist[0].dirno = 5; openfilelist[0].diroff = 0;

strcpy(openfilelist[0].dir, \ openfilelist[0].father = 0; openfilelist[0].count = 0; openfilelist[0].fcbstate = 0; openfilelist[0].topenfile = 1;

for(i = 1; i < MAXOPENFILE; i++) openfilelist[i].topenfile = 0; curdir = 0;

strcpy(currentdir, \

startp = ((block0 *)myvhard)->startblock; }

void my_format() {

FILE *fp;

fat *fat1, *fat2; block0 *blk0; time_t now;

struct tm *nowtime; fcb *root; int i;

blk0 = (block0 *)myvhard;

fat1 = (fat *)(myvhard + BLOCKSIZE); fat2 = (fat *)(myvhard + 3 * BLOCKSIZE); root = (fcb *)(myvhard + 5 * BLOCKSIZE); strcpy(blk0->magic, \

strcpy(blk0->information, \FileSystem Ver size=1000KB Blocknum=1000 RootBlocknum=2\\n\ blk0->root = 5;

blk0->startblock = (unsigned char *)root; for(i = 0; i < 5; i++) {

fat1->id = END; fat2->id = END; fat1++; fat2++; }

fat1->id = 6; fat2->id = 6; fat1++; fat2++;

fat1->id = END; fat2->id = END; fat1++; fat2++;

for(i = 7; i < SIZE / BLOCKSIZE; i++) {

fat1->id = FREE; fat2->id = FREE; fat1++; fat2++; }

now = time(NULL);

1.0 \\n Blocksize=1KB Whole nowtime = localtime(&now); strcpy(root->filename, \ strcpy(root->exname, \ root->attribute = 0x28;

root->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;

root->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday; root->first = 5;

root->length = 2 * sizeof(fcb); root->free = 1; root++;

now = time(NULL);

nowtime = localtime(&now); strcpy(root->filename, \ strcpy(root->exname, \ root->attribute = 0x28;

root->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;

root->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday; root->first = 5;

root->length = 2 * sizeof(fcb); root->free = 1;

fp = fopen(myfilename, \ fwrite(myvhard, SIZE, 1, fp); fclose(fp); }

void my_cd(char *dirname) {

char *dir; int fd;

dir = strtok(dirname, \·Ö½â×Ö·û´®ÎªÒ»×é×Ö·û´®¡£dirnameΪҪ·Ö½âµÄ×Ö·û´®£¬\Ϊ·Ö¸ô·û×Ö·û´®

if(strcmp(dir, \ return;

else if(strcmp(dir, \ {

if(curdir)

curdir = my_close(curdir); return; }

else if(strcmp(dir, \ {

while(curdir)

curdir = my_close(curdir); dir = strtok(NULL, \ }

while(dir) {

fd = my_open(dir); if(fd != -1)

curdir = fd; else

return;

dir = strtok(NULL, \ } }

void my_mkdir(char *dirname) {

fcb *fcbptr; fat *fat1, *fat2; time_t now;

struct tm *nowtime; char text[MAXTEXT]; unsigned short blkno; int rbn, fd, i;

fat1 = (fat *)(myvhard + BLOCKSIZE); fat2 = (fat *)(myvhard + 3 * BLOCKSIZE); openfilelist[curdir].count = 0;

rbn = do_read(curdir, openfilelist[curdir].length, text); fcbptr = (fcb *)text;

for(i = 0; i < rbn / sizeof(fcb); i++)//ÔÚµ±Ç°Ä¿Â¼ÏÂÕÒ£¬ÊÇ·ñÓÐÖØÃûĿ¼ {

if(strcmp(fcbptr->filename, dirname) == 0 && strcmp(fcbptr->exname, \ {

printf(\ return; }

fcbptr++; }

fcbptr = (fcb *)text;

for(i = 0; i < rbn / sizeof(fcb); i++) {

if(fcbptr->free == 0) break; fcbptr++; }

blkno = findblock();//ѰÕÒ¿ÕÏÐÅÌ¿é if(blkno == -1) return;

(fat1 + blkno)->id = END; (fat2 + blkno)->id = END; now = time(NULL);

nowtime = localtime(&now);

strcpy(fcbptr->filename, dirname); strcpy(fcbptr->exname, \ fcbptr->attribute = 0x30;

fcbptr->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;

fcbptr->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday;

fcbptr->first = blkno;

fcbptr->length = 2 * sizeof(fcb); fcbptr->free = 1;

openfilelist[curdir].count = i * sizeof(fcb);//°Ñµ±Ç°Ä¿Â¼µÄÎļþ¶ÁдָÕ붨λµ½Îļþĩβ do_write(curdir, (char *)fcbptr, sizeof(fcb), 2);//´ÓÖ¸Õëfcbptr¿ªÊ¼Ð´Ò»¸öfcb´óСµÄÄÚÈݵ½µ±Ç°Ä¿Â¼Îļþĩβ

fd = my_open(dirname);//·µ»ØÐ½¨Á¢µÄĿ¼ÎļþÔÚÓû§´ò¿ªÎļþÊý×éµÄϱê if(fd == -1) return;

fcbptr = (fcb *)malloc(sizeof(fcb));//½¨Á¢ÐÂĿ¼µÄ'.','..'Ŀ¼ now = time(NULL);

nowtime = localtime(&now); strcpy(fcbptr->filename, \ strcpy(fcbptr->exname, \ fcbptr->attribute = 0x28;

fcbptr->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;

fcbptr->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday;

fcbptr->first = blkno;

fcbptr->length = 2 * sizeof(fcb); fcbptr->free = 1;

do_write(fd, (char *)fcbptr, sizeof(fcb), 2); now = time(NULL);

nowtime = localtime(&now); strcpy(fcbptr->filename, \ strcpy(fcbptr->exname, \ fcbptr->attribute = 0x28;

fcbptr->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec

/ 2;

fcbptr->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday;

fcbptr->first = blkno;

fcbptr->length = 2 * sizeof(fcb); fcbptr->free = 1;

do_write(fd, (char *)fcbptr, sizeof(fcb), 2); free(fcbptr); my_close(fd);

fcbptr = (fcb *)text;

fcbptr->length = openfilelist[curdir].length; openfilelist[curdir].count = 0;

do_write(curdir, (char *)fcbptr, sizeof(fcb), 2);//¸üе±Ç°Ä¿Â¼ÎļþµÄÄÚÈÝ openfilelist[curdir].fcbstate = 1; }

void my_rmdir(char *dirname) {

fcb *fcbptr,*fcbptr2;

fat *fat1, *fat2, *fatptr1, *fatptr2;

char text[MAXTEXT], text2[MAXTEXT]; unsigned short blkno; int rbn, rbn2, fd, i, j;

fat1 = (fat *)(myvhard + BLOCKSIZE); fat2 = (fat *)(myvhard + 3 * BLOCKSIZE);

if(strcmp(dirname, \ {

printf(\ return; }

openfilelist[curdir].count = 0;

rbn = do_read(curdir, openfilelist[curdir].length, text); fcbptr = (fcb *)text;

for(i = 0; i < rbn / sizeof(fcb); i++)//²éÕÒҪɾ³ýµÄĿ¼ {

if(strcmp(fcbptr->filename, dirname) == 0 && strcmp(fcbptr->exname, \ break; fcbptr++; }

if(i == rbn / sizeof(fcb)) {

printf(\ return;

}

fd = my_open(dirname);//Ŀ¼ÔÚµ±Ç°´ò¿ªÎļþÊý×éÖеÄϱê

rbn2 = do_read(fd, openfilelist[fd].length, text2);//¶ÁȡҪɾ³ýµÄĿ¼µÄÄÚÈÝ fcbptr2 = (fcb *)text2;

for(j = 0; j < rbn2 / sizeof(fcb); j++)//ÅжÏҪɾ³ýĿ¼ÊÇ·ñΪ¿Õ {

if(strcmp(fcbptr2->filename, \&& strcmp(fcbptr2->filename, \&& strcmp(fcbptr2->filename, \ {

my_close(fd);

printf(\ return; }

fcbptr2++; }

blkno = openfilelist[fd].first;

while(blkno != END)//ÐÞ¸ÄҪɾ³ýĿ¼ÔÚfatÖÐËùÕ¼ÓõÄĿ¼ÏîµÄÊôÐÔ {

fatptr1 = fat1 + blkno; fatptr2 = fat2 + blkno; blkno = fatptr1->id; fatptr1->id = FREE; fatptr2->id = FREE; }

my_close(fd);

strcpy(fcbptr->filename, \ÐÞ¸ÄÒÑɾ³ýĿ¼ÔÚµ±Ç°Ä¿Â¼µÄfcbµÄÊôÐÔ fcbptr->free = 0;

openfilelist[curdir].count = i * sizeof(fcb);//¸üе±Ç°Ä¿Â¼ÎļþµÄÄÚÈÝ do_write(curdir, (char *)fcbptr, sizeof(fcb), 2); openfilelist[curdir].fcbstate = 1; }

void my_ls() {

fcb *fcbptr;

char text[MAXTEXT]; int rbn, i;

openfilelist[curdir].count = 0;

rbn = do_read(curdir, openfilelist[curdir].length, text); fcbptr = (fcb *)text;

for(i = 0; i < rbn / sizeof(fcb); i++) {

if(fcbptr->free) {

if(fcbptr->attribute & 0x20)

printf(\

fcbptr->filename, (fcbptr->date >> 9) + 1980, (fcbptr->date >> 5) & 0x000f, fcbptr->date & 0x001f, fcbptr->time >> 11, (fcbptr->time >> 5) & 0x003f, fcbptr->time & 0x001f * 2); else

printf(\

fcbptr->filename, fcbptr->exname, (int)(fcbptr->length), (fcbptr->date >> 9) + 1980, (fcbptr->date >> 5) & 0x000f, fcbptr->date & 0x1f, fcbptr->time >> 11, (fcbptr->time >> 5) & 0x3f, fcbptr->time & 0x1f * 2); }

fcbptr++; } }

void my_create(char *filename) {

fcb *fcbptr; fat *fat1, *fat2;

char *fname, *exname, text[MAXTEXT]; unsigned short blkno; int rbn, i; time_t now;

struct tm *nowtime;

fat1 = (fat *)(myvhard + BLOCKSIZE); fat2 = (fat *)(myvhard + BLOCKSIZE); fname = strtok(filename, \ exname = strtok(NULL, \ if(strcmp(fname, \ {

printf(\ return; }

if(!exname) {

printf(\ return; }

openfilelist[curdir].count = 0;

rbn = do_read(curdir, openfilelist[curdir].length, text); fcbptr = (fcb *)text;

for(i = 0; i < rbn / sizeof(fcb); i++) {

if(strcmp(fcbptr->filename, fname) == 0 && strcmp(fcbptr->exname, exname) == 0)

{

printf(\

return; }

fcbptr++; }

fcbptr = (fcb *)text;

for(i = 0; i < rbn / sizeof(fcb); i++) {

if(fcbptr->free == 0) break; fcbptr++; }

blkno = findblock(); if(blkno == -1) return;

(fat1 + blkno)->id = END; (fat2 + blkno)->id = END;

now = time(NULL);

nowtime = localtime(&now); strcpy(fcbptr->filename, fname); strcpy(fcbptr->exname, exname); fcbptr->attribute = 0x00;

fcbptr->time = nowtime->tm_hour * 2048 + nowtime->tm_min * 32 + nowtime->tm_sec / 2;

fcbptr->date = (nowtime->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->tm_mday;

fcbptr->first = blkno; fcbptr->length = 0; fcbptr->free = 1;

openfilelist[curdir].count = i * sizeof(fcb); do_write(curdir, (char *)fcbptr, sizeof(fcb), 2); fcbptr = (fcb *)text;

fcbptr->length = openfilelist[curdir].length; openfilelist[curdir].count = 0;

do_write(curdir, (char *)fcbptr, sizeof(fcb), 2); openfilelist[curdir].fcbstate = 1; }

void my_rm(char *filename) {

fcb *fcbptr;

fat *fat1, *fat2, *fatptr1, *fatptr2;

char *fname, *exname, text[MAXTEXT]; unsigned short blkno; int rbn, i;

fat1 = (fat *)(myvhard + BLOCKSIZE); fat2 = (fat *)(myvhard + 3 * BLOCKSIZE); fname = strtok(filename, \ exname = strtok(NULL, \ if(strcmp(fname, \ {

printf(\ return; }

if(!exname) {

printf(\ return; }

openfilelist[curdir].count = 0;

rbn = do_read(curdir, openfilelist[curdir].length, text); fcbptr = (fcb *)text;

for(i = 0; i < rbn / sizeof(fcb); i++) {

if(strcmp(fcbptr->filename, fname) == 0 && strcmp(fcbptr->exname, exname) == 0)

break; fcbptr++; }

if(i == rbn / sizeof(fcb)) {

printf(\ return; }

blkno = fcbptr->first; while(blkno != END) {

fatptr1 = fat1 + blkno; fatptr2 = fat2 + blkno; blkno = fatptr1->id; fatptr1->id = FREE; fatptr2->id = FREE; }

strcpy(fcbptr->filename, \ fcbptr->free = 0;

openfilelist[curdir].count = i * sizeof(fcb); do_write(curdir, (char *)fcbptr, sizeof(fcb), 2); openfilelist[curdir].fcbstate = 1; }

int my_open(char *filename) {

fcb *fcbptr;

char *fname, exname[3], *str, text[MAXTEXT]; int rbn, fd, i;

fname = strtok(filename, \ str = strtok(NULL, \ if(str)

strcpy(exname, str); else

strcpy(exname, \

for(i = 0; i < MAXOPENFILE; i++)//ÔÚÓû§´ò¿ªÎļþÊý×é²éÕÒ¿´µ±Ç°ÎļþÊÇ·ñÒѾ­´ò¿ª {

if(strcmp(openfilelist[i].filename, fname) == 0 && strcmp(openfilelist[i].exname, exname) == 0 && i != curdir) {

printf(\ return -1; } }

openfilelist[curdir].count = 0;

rbn = do_read(curdir, openfilelist[curdir].length, text); fcbptr = (fcb *)text;

for(i = 0; i < rbn / sizeof(fcb); i++)//ÔÚµ±Ç°Ä¿Â¼ÏÂÕÒÒª´ò¿ªµÄÎļþÊÇ·ñ´æÔÚ {

if(strcmp(fcbptr->filename, fname) == 0 && strcmp(fcbptr->exname, exname) == 0)

break; fcbptr++; }

if(i == rbn / sizeof(fcb)) {

printf(\ return -1; }

fd = findopenfile();//ѰÕÒ¿ÕÏÐÎļþ±íÏî if(fd == -1) return -1;

strcpy(openfilelist[fd].filename, fcbptr->filename); strcpy(openfilelist[fd].exname, fcbptr->exname); openfilelist[fd].attribute = fcbptr->attribute; openfilelist[fd].time = fcbptr->time; openfilelist[fd].date = fcbptr->date;

openfilelist[fd].first = fcbptr->first; openfilelist[fd].length = fcbptr->length; openfilelist[fd].free = fcbptr->free;

openfilelist[fd].dirno = openfilelist[curdir].first; openfilelist[fd].diroff = i;

strcpy(openfilelist[fd].dir, openfilelist[curdir].dir); strcat(openfilelist[fd].dir, filename); if(fcbptr->attribute & 0x20)

strcat(openfilelist[fd].dir, \ openfilelist[fd].father = curdir; openfilelist[fd].count = 0; openfilelist[fd].fcbstate = 0; openfilelist[fd].topenfile = 1; return fd; }

int my_close(int fd) {

fcb *fcbptr; int father;

if(fd < 0 || fd >= MAXOPENFILE) {

printf(\ return -1; }

if(openfilelist[fd].fcbstate) {

fcbptr = (fcb *)malloc(sizeof(fcb));

strcpy(fcbptr->filename, openfilelist[fd].filename); strcpy(fcbptr->exname, openfilelist[fd].exname); fcbptr->attribute = openfilelist[fd].attribute; fcbptr->time = openfilelist[fd].time; fcbptr->date = openfilelist[fd].date; fcbptr->first = openfilelist[fd].first; fcbptr->length = openfilelist[fd].length; fcbptr->free = openfilelist[fd].free; father = openfilelist[fd].father;

openfilelist[father].count = openfilelist[fd].diroff * sizeof(fcb); do_write(father, (char *)fcbptr, sizeof(fcb), 2); free(fcbptr);

openfilelist[fd].fcbstate = 0; }

strcpy(openfilelist[fd].filename, \ strcpy(openfilelist[fd].exname, \ openfilelist[fd].topenfile = 0;

return father; }

int my_write(int fd) {

fat *fat1, *fat2, *fatptr1, *fatptr2; int wstyle, len, ll, tmp; char text[MAXTEXT]; unsigned short blkno;

fat1 = (fat *)(myvhard + BLOCKSIZE); fat2 = (fat *)(myvhard + 3 * BLOCKSIZE); if(fd < 0 || fd >= MAXOPENFILE) {

printf(\ return -1; }

while(1) {

printf(\enter the number of write style:\\n1.cut write\\t2.cover write\\t3.add write\\n\

scanf(\

if(wstyle > 0 && wstyle < 4) break;

printf(\ }

getchar(); switch(wstyle) {

case 1://½Ø¶Ïд°ÑÔ­ÎļþËùÕ¼µÄÐéÄâ´ÅÅ̿ռäÖØÖÃΪ1 blkno = openfilelist[fd].first; fatptr1 = fat1 + blkno; fatptr2 = fat2 + blkno; blkno = fatptr1->id; fatptr1->id = END; fatptr2->id = END; while(blkno != END) {

fatptr1 = fat1 + blkno; fatptr2 = fat2 + blkno; blkno = fatptr1->id; fatptr1->id = FREE; fatptr2->id = FREE; }

openfilelist[fd].count = 0; openfilelist[fd].length = 0;

break; case 2:

openfilelist[fd].count = 0; break; case 3:

openfilelist[fd].count = openfilelist[fd].length; break; default: break; }

ll = 0;

printf(\ while(gets(text)) {

len = strlen(text); text[len++] = '\\n'; text[len] = '\\0';

tmp = do_write(fd, text, len, wstyle); if(tmp != -1) ll += tmp; if(tmp < len) {

printf(\ break; } }

return ll;//ʵ¼ÊдµÄ×Ö½ÚÊý }

int do_write(int fd, char *text, int len, char wstyle) {

fat *fat1, *fat2, *fatptr1, *fatptr2; unsigned char *buf, *blkptr; unsigned short blkno, blkoff; int i, ll;

fat1 = (fat *)(myvhard + BLOCKSIZE); fat2 = (fat *)(myvhard + 3 * BLOCKSIZE); buf = (unsigned char *)malloc(BLOCKSIZE); if(buf == NULL) {

printf(\ return -1; }

blkno = openfilelist[fd].first;

blkoff = openfilelist[fd].count; fatptr1 = fat1 + blkno; fatptr2 = fat2 + blkno;

while(blkoff >= BLOCKSIZE) {

blkno = fatptr1->id; if(blkno == END) {

blkno = findblock(); if(blkno == -1) {

free(buf); return -1; }

fatptr1->id = blkno; fatptr2->id = blkno; fatptr1 = fat1 + blkno; fatptr2 = fat2 + blkno; fatptr1->id = END; fatptr2->id = END; } else {

fatptr1 = fat1 + blkno; fatptr2 = fat2 + blkno; }

blkoff = blkoff - BLOCKSIZE;//ÈÃblkoff¶¨Î»µ½Îļþ×îºóÒ»¸ö´ÅÅÌ¿éµÄ¶ÁдλÖà }

ll = 0;//ʵ¼ÊдµÄ×Ö½ÚÊý

while(ll < len)//lenÊÇÓû§ÊäÈëµÄ×Ö½ÚÊý {

blkptr = (unsigned char *)(myvhard + blkno * BLOCKSIZE); for(i = 0; i < BLOCKSIZE; i++) buf[i] = blkptr[i];

for(;blkoff < BLOCKSIZE; blkoff++) {

buf[blkoff] = text[ll++]; openfilelist[fd].count++; if(ll == len) break; }

for(i = 0; i < BLOCKSIZE; i++) blkptr[i] = buf[i];

if(ll < len)//Èç¹ûÒ»¸ö´ÅÅÌ¿éд²»Ï£¬ÔòÔÙ·ÖÅäÒ»¸ö´ÅÅÌ¿é {

blkno = fatptr1->id; if(blkno == END) {

blkno = findblock(); if(blkno == -1) break;

fatptr1->id = blkno; fatptr2->id = blkno; fatptr1 = fat1 + blkno; fatptr2 = fat2 + blkno; fatptr1->id = END; fatptr2->id = END; } else {

fatptr1 = fat1 + blkno; fatptr2 = fat2 + blkno; }

blkoff = 0; } }

if(openfilelist[fd].count > openfilelist[fd].length) openfilelist[fd].length = openfilelist[fd].count; openfilelist[fd].fcbstate = 1; free(buf); return ll; }

int my_read(int fd, int len) {

char text[MAXTEXT]; int ll;

if(fd < 0 || fd >= MAXOPENFILE) {

printf(\ return -1; }

openfilelist[fd].count = 0;

ll = do_read(fd, len, text);//llÊÇʵ¼Ê¶Á³öµÄ×Ö½ÚÊý if(ll != -1)

printf(\ else

printf(\

return ll; }

int do_read(int fd, int len, char *text) {

fat *fat1, *fatptr;

unsigned char *buf, *blkptr; unsigned short blkno, blkoff; int i, ll;

fat1 = (fat *)(myvhard + BLOCKSIZE);

buf = (unsigned char *)malloc(BLOCKSIZE); if(buf == NULL) {

printf(\ return -1; }

blkno = openfilelist[fd].first; blkoff = openfilelist[fd].count; if(blkoff >= openfilelist[fd].length) {

puts(\ free(buf); return -1; }

fatptr = fat1 + blkno;

while(blkoff >= BLOCKSIZE)//blkoffΪ×îºóÒ»¿éÅÌ¿éÊ£ÓàµÄÈÝÁ¿ {

blkno = fatptr->id;

blkoff = blkoff - BLOCKSIZE; fatptr = fat1 + blkno; }

ll = 0;

while(ll < len) {

blkptr = (unsigned char *)(myvhard + blkno * BLOCKSIZE);

for(i = 0; i < BLOCKSIZE; i++)//½«×îºóÒ»¿éÅÌ¿éµÄÄÚÈݶÁÈ¡µ½bufÖÐ buf[i] = blkptr[i];

for(; blkoff < BLOCKSIZE; blkoff++) {

text[ll++] = buf[blkoff]; openfilelist[fd].count++;

if(ll == len || openfilelist[fd].count == openfilelist[fd].length) break; }

if(ll < len && openfilelist[fd].count != openfilelist[fd].length)

{

blkno = fatptr->id; if(blkno == END) break; blkoff = 0;

fatptr = fat1 + blkno; } }

text[ll] = '\\0'; free(buf); return ll; }

void my_exitsys() {

FILE *fp; while(curdir)

curdir = my_close(curdir); fp = fopen(myfilename, \ fwrite(myvhard, SIZE, 1, fp); fclose(fp);

free(myvhard); }

unsigned short findblock() {

unsigned short i; fat *fat1, *fatptr;

fat1 = (fat *)(myvhard + BLOCKSIZE); for(i = 7; i < SIZE / BLOCKSIZE; i++) {

fatptr = fat1 + i;

if(fatptr->id == FREE) return i; }

printf(\ return -1; }

int findopenfile() {

int i;

for(i = 0; i < MAXTEXT; i++) {

if(openfilelist[i].topenfile == 0) return i;

}

printf(\ return -1; }

int main() {

char cmd[15][10] = {\\\\\\\ char s[30], *sp;

int cmdn, flag = 1, i; startsys();

printf(\System V1.0*******************************\\n\\n\ printf(\ÃüÁîÃû\\t\\tÃüÁî²ÎÊý\\t\\tÃüÁî˵Ã÷\\n\\n\

printf(\Ŀ¼Ãû(·¾¶Ãû)\\t\\tÇл»µ±Ç°Ä¿Â¼µ½Ö¸¶¨Ä¿Â¼\\n\ printf(\Ŀ¼Ãû\\t\\t\\tÔÚµ±Ç°Ä¿Â¼´´½¨ÐÂĿ¼\\n\ printf(\Ŀ¼Ãû\\t\\t\\tÔÚµ±Ç°Ä¿Â¼É¾³ýÖ¸¶¨Ä¿Â¼\\n\ printf(\ÎÞ\\t\\t\\tÏÔʾµ±Ç°Ä¿Â¼ÏµÄĿ¼ºÍÎļþ\\n\

printf(\ÎļþÃû\\t\\t\\tÔÚµ±Ç°Ä¿Â¼Ï´´½¨Ö¸¶¨Îļþ\\n\ printf(\ÎļþÃû\\t\\t\\tÔÚµ±Ç°Ä¿Â¼ÏÂɾ³ýÖ¸¶¨Îļþ\\n\ printf(\ÎļþÃû\\t\\t\\tÔÚµ±Ç°Ä¿Â¼Ï´ò¿ªÖ¸¶¨Îļþ\\n\ printf(\ÎÞ\\t\\t\\tÔÚ´ò¿ªÎļþ״̬Ï£¬Ð´¸ÃÎļþ\\n\ printf(\ÎÞ\\t\\t\\tÔÚ´ò¿ªÎļþ״̬Ï£¬¶ÁÈ¡¸ÃÎļþ\\n\ printf(\ÎÞ\\t\\t\\tÔÚ´ò¿ªÎļþ״̬Ï£¬¶ÁÈ¡¸ÃÎļþ\\n\ printf(\ÎÞ\\t\\t\\tÍ˳öϵͳ\\n\\n\

printf(\n\

while(flag) {

printf(\ gets(s); cmdn = -1;

if(strcmp(s, \ {

sp=strtok(s, \ for(i = 0; i < 15; i++) {

if(strcmp(sp, cmd[i]) == 0) {

cmdn = i; break; } }

// printf(\ switch(cmdn) {

case 0:

sp = strtok(NULL, \

if(sp && (openfilelist[curdir].attribute & 0x20)) my_cd(sp); else

printf(\ break; case 1:

sp = strtok(NULL, \

if(sp && (openfilelist[curdir].attribute & 0x20)) my_mkdir(sp); else

printf(\ break; case 2:

sp = strtok(NULL, \

if(sp && (openfilelist[curdir].attribute & 0x20)) my_rmdir(sp); else

printf(\ break; case 3:

if(openfilelist[curdir].attribute & 0x20) my_ls(); else

printf(\ break; case 4:

sp = strtok(NULL, \

if(sp && (openfilelist[curdir].attribute & 0x20)) my_create(sp); else

printf(\ break; case 5:

sp = strtok(NULL, \

if(sp && (openfilelist[curdir].attribute & 0x20)) my_rm(sp); else

printf(\ break;

case 6:

sp = strtok(NULL, \

if(sp && (openfilelist[curdir].attribute & 0x20)) {

if(strchr(sp, '.'))//²éÕÒspÖÐ'.'Ê״γöÏÖµÄλÖà curdir = my_open(sp); else

printf(\ } else

printf(\ break; case 7:

if(!(openfilelist[curdir].attribute & 0x20)) curdir = my_close(curdir); else

printf(\ break; case 8:

if(!(openfilelist[curdir].attribute & 0x20)) my_write(curdir); else

printf(\ break; case 9:

if(!(openfilelist[curdir].attribute & 0x20))

my_read(curdir, openfilelist[curdir].length); else

printf(\ break; case 10:

if(openfilelist[curdir].attribute & 0x20) {

my_exitsys(); flag = 0; } else

printf(\ break; default:

printf(\ break; } }

}

return 0; }

ËÄ¡¢×ܽ᣺

£¨°üÀ¨Éè¼Æ¹ý³ÌÖÐÓöµ½µÄÎÊÌâ¼°½â¾ö°ì·¨¡¢³ÌÐòµÄ²»×ã·ÖÎö¼°¸Ä½ø½¨Òé¡¢¿Î³ÌÉè¼ÆµÄÊÕ»ñµÈ£©

ÔÚÎÒÃÇС×éʵÑé¹ý³ÌÖУ¬¸Õ¿ªÊ¼¶Ôµ±Ç°Ä¿Â¼ºÍµ±Ç°Ä¿Â¼µÄ¸¸Ä¿Â¼ÕâЩÎÊÌ⣬Àí½âµÄ²»ÊÇÌØ±ðÇå³þ¡£»¹ÓоÍÊÇÔڣƣÁ£Ô±íµÄ¹¹Ôì¹ý³ÌÖУ¬Ã¿¸ö£æ£á£ôÔªËØËù¶ÔÓ¦µÄº¬ÒåûÓÐÀíµÃÊ®·ÖÇå³þ¡££Æ£á£ô±íÖеÄÔªËØÓëÊý¾Ý¿éµÄ¶ÔÓ¦¹ØÏµ£¬ÔÚÎÒÃÇÕû¸ö¸öʵÑé¹ý³ÌÖÐÊǷdz£ÖØÒªµÄ¡£

³ÌÐòÖеIJ»×ãÊÇÔÚ£í£ù£ß£÷£ò£é£ô£åº¯ÊýÖУ¬wstyleÕâ¸öÐβÎûÓÐÔÚº¯ÊýÖÐʵÏÖÈ«²¿µÄ¹¦ÄÜ¡£Ð´µÄ¹¦ÄÜֻʵÏÖÁ˸²¸Çд ºÁÎÞÒÉÎÊ£¬Í¨¹ýÕâ´ÎʵÑ飬ÎÒÃÇ·Ö×éµÄ¸÷¸öС×éµÄ³ÉÔ±¶¼±ÈÒÔǰ¸ü¼ÓÊìϤ£¬¹ØÏµÒ²¸ü¼ÓÓѺá£×îÖØÒªµÄÊÇ£¬ÔÚÒ»¿éÌÖÂÛÎÊÌâµÄʱºò£¬±Ë´ËÕë¶ÔÏà¹ØÎÊÌâµÄÕùÂÛʹÎÊÌâ¸ü¼Ó¿ìµÄ±äÃ÷ÁË¡£