²Ù×÷ϵͳ¿Î³ÌÉè¼Æ±¨¸æ
С×é±àºÅ£º С×é³ÉÔ±£º
Ò»¡¢¿Î³ÌÉè¼Æ¸ÅÊö£º
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
¼ÓÔØÎļþϵͳ 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Õâ¸öÐβÎûÓÐÔÚº¯ÊýÖÐʵÏÖÈ«²¿µÄ¹¦ÄÜ¡£Ð´µÄ¹¦ÄÜֻʵÏÖÁ˸²¸Çд ºÁÎÞÒÉÎÊ£¬Í¨¹ýÕâ´ÎʵÑ飬ÎÒÃÇ·Ö×éµÄ¸÷¸öС×éµÄ³ÉÔ±¶¼±ÈÒÔǰ¸ü¼ÓÊìϤ£¬¹ØÏµÒ²¸ü¼ÓÓѺá£×îÖØÒªµÄÊÇ£¬ÔÚÒ»¿éÌÖÂÛÎÊÌâµÄʱºò£¬±Ë´ËÕë¶ÔÏà¹ØÎÊÌâµÄÕùÂÛʹÎÊÌâ¸ü¼Ó¿ìµÄ±äÃ÷ÁË¡£