• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-22  評論-7  文章-0  trackbacks-0

            昨天,公司的美國客戶發(fā)郵件給我,說我的軟件出問題了,我查來查去,發(fā)現(xiàn)居然是服務(wù)器上一個目錄無法刪除,一刪除就報 cannot read from the source file or disk. 如果用命令行方式刪除,則報  cannot find the specified path。一開始以為是文件系統(tǒng)遭破壞了,用 chkdsk 命令檢查,沒有發(fā)現(xiàn)問題,后來仔細一看,那個不能刪除的目錄名居然以一個空格字符結(jié)尾,而我嘗試在資源管理器中創(chuàng)建一個目錄以空格結(jié)尾結(jié)果資源管理器會自動將末尾的字符刪除,用程序創(chuàng)建,結(jié)果也一樣,這個美國佬是怎么創(chuàng)建這個古怪的目錄的?出現(xiàn)這種情況后不但是無法刪除這么簡單,列目錄什么的也會有問題,這樣一來,系統(tǒng)的運行都會有問題,我想到的最壞結(jié)果就是可能不得不格式化服務(wù)器的硬盤,想到這里我?guī)缀醪桓以傧胂氯チ耍esearch了一天,后來終于找到了解決方案,并且由此還發(fā)現(xiàn)問題的起因是我程序上的一個Bug造成,可怕的Bug!

            Windows 的文件系統(tǒng)可以支持特殊字符的文件名,比如以空格結(jié)尾,以點號結(jié)尾等,有一篇英文的文章說NTFS 支持這些文件名,但FAT不支持,我試了一下,F(xiàn)AT也支持。但Windows API 卻對這些特殊文件名進行了限制,也就是說,我們通過程序是無法創(chuàng)建一個以空格或點號結(jié)尾的文件名或路徑名的。但Copy 和 Move的API 卻不做這方面的限制,這導(dǎo)致我們可以從其他的文件系統(tǒng)拷貝或移動一個特殊文件名的文件到Windows 的文件系統(tǒng),但一旦在Windows的文件系統(tǒng)上創(chuàng)建成功,就無法通過正常途徑刪除或改名。因為調(diào)用API 刪除或改名時,API 會首先進行規(guī)則檢查,如果發(fā)現(xiàn)不符合規(guī)則,則直接忽略。這兩組API 在處理上的不一致,帶來一個非常嚴重的安全問題,可惜微軟到了Windows7 還沒有去彌補這個問題。

            下面讓我們用代碼復(fù)現(xiàn)這個問題

                        try
                        {
                            string dir = @"C:\Temp\abc";
                            System.IO.Directory.CreateDirectory(dir); //在C:\Temp 目錄下創(chuàng)建abc 這個目錄
             
                            string dir1 = @"c:\Temp\Bcd \";
             
                            System.IO.Directory.Move(dir, dir1); //將ABC 移動到"Bcd "這個目錄去,注意這里 Bcd后面有個空格
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }

            在運行這段代碼前,你一定要有一點思想準備,因為一旦運行成功,你的 C:\temp 目錄下就有了一個 “Bcd ”這樣的古怪的目錄,而且你用正常的方法根本無法刪除它。如果我在此打住,你一定會為之抓狂。不過沒關(guān)系,我已經(jīng)找到了刪除它的方法,下面就和大家共享:

             

            Windows 的命令行工具 Del 和 Rd 支持一種方式可以不對輸入文件名的合法性進行檢查,這種方式是在完整目錄名前加一個 \\?\

            比如

            del “\\?\C:\Temp\xxx.” 刪除xxx. 這個文件

            刪除目錄的話

            rd /s “\\?\C:\Temp\xxx.” 刪除 xxx. 這個目錄

            執(zhí)行這個命令后,就可以刪除這些古怪的文件了。注意,這里一定要輸入完整的目錄才可以,相對路徑不行。

             

            講到這里,我們知道了原因和解決方案,那么在這里我需要提醒大家我們以后在程序中調(diào)用 System.IO.Directory.Move 或者 System.IO.File.Copy , System.IO.File.Move 這些函數(shù)前,一定要注意先判斷一下輸入的目標文件名或目錄名的結(jié)尾是不是空格或點號,可能還要判斷其他情況,但目前我只知道這兩種情況,而且結(jié)尾是空格非常有隱蔽性。

            posted on 2010-05-28 14:58 楚天清秋 閱讀(3584) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久精品国产精品亚洲人人| 欧美日韩精品久久久免费观看 | 欧美大战日韩91综合一区婷婷久久青草 | 久久国产乱子伦精品免费午夜| 亚洲天堂久久久| 久久久久久精品免费看SSS| 国产精品99久久免费观看| 国内精品久久久久久久coent | 久久不见久久见免费视频7| 久久国产福利免费| 久久精品麻豆日日躁夜夜躁| 99久久99久久精品国产片果冻| 久久午夜夜伦鲁鲁片免费无码影视| 国产精品毛片久久久久久久| 一级a性色生活片久久无少妇一级婬片免费放 | 国产精品久久久久影视不卡| 亚洲国产成人久久一区久久| 成人久久综合网| 久久精品国产精品亚洲精品| 精品多毛少妇人妻AV免费久久 | 99久久精品免费看国产一区二区三区| 久久精品无码午夜福利理论片 | 人妻无码久久一区二区三区免费| 久久97久久97精品免视看| 日韩人妻无码精品久久久不卡| 欧美大战日韩91综合一区婷婷久久青草 | 无码人妻精品一区二区三区久久久| 久久国产视屏| 热99re久久国超精品首页| 亚洲AV无码1区2区久久| 欧美性大战久久久久久| 国产99久久精品一区二区| 亚洲精品无码久久久久| 伊人 久久 精品| 久久婷婷色综合一区二区| 日本久久久久久中文字幕| 久久99精品久久久久婷婷| 久久人人爽人人爽人人片AV东京热| 久久精品国产色蜜蜜麻豆| 夜夜亚洲天天久久| 国产精品久久自在自线观看|