作者jayzhuang (Jay)
看板C_and_CPP
標題[問題] 透過system() 刪除檔案
時間Fri Jul 5 17:45:46 2019
開發平台(Platform): (Ex: Win10, Linux, ...)
Windows
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VS2019
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
無法透過system()刪除我指定的檔案
餵入的資料(Input):
預期的正確結果(Expected Output):
刪除掉檔案
錯誤結果(Wrong Output):
沒反應,檔案依舊還在。
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
因為我有先寫了一個Function為 (//刪除檔名,只獲得路徑字串)
string GetFilePath()
{
TCHAR _szFilePath[MAX_PATH + 1] = { 0 };
GetModuleFileName(NULL,_szFilePath,MAX_PATH);
(_tcsrchr(_szFilePath, _T('\\')))[1] = 0; //刪除檔名,只獲得路徑字串
string strPath;
for(int n = 0; _szFilePath[n];n++)
{
if (_szFilePath[n] != _T('\\'))
{
strPath += _szFilePath[n];
}
else
{
strPath += ("\\\\");
}
}
return strPath;
}
之後寫一個clsss,此內容顯示的為刪除我要的檔案LGPO_Machine_word.txt
因為檔案出現都是與執行檔同一個路徑
(自動跑出,要能自動刪除)
此類別為刪除的指令
class Class_LGPO_Order{
public:
string Del_Machine_Order() { return Machine_Txt_Del; }
private:
string Machine_Txt_Del = "Del " + GetFilePath() + "LGPO_Machine_word.txt";
}
主程式內寫的
void WINAPI ServiceMain(int argc, char** argv){
(中間很多是Windows Service需要的程式碼就不顯示)
關鍵在這:
while (true)
{
// 執行刪除
system(LGPO_Order.Del_Machine_Order().data());
}
}
補充說明(Supplement):
上述的LGPO_Order.Del_Machine_Order().data() <----此段顯示的文字為:
(透過debug產生的)
Del C:\\LGPO\\Debug\\LGPO_Machine_word.txt
實際實驗直接指定路徑刪除是可行
system("Del C:\\LGPO\\Debug\\LGPO_Machine_word.txt");
下圖為資料夾路徑
https://imgur.com/vLrWKDG
但不知道為什麼換了這樣寫就無法刪除..... 想請各位大神給我點指示
system(LGPO_Order.Del_Machine_Order().data());
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.102.123 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1562319950.A.E9C.html
→ firejox: "\\"為 '\\' '\0'的字串 07/05 19:27
→ eye5002003: 建議使用boost.filesystem 別自己處理 07/05 22:13
→ sarafciel: windows的system有吃string? 07/05 23:00
→ stucode: 先忽略硬把 TCHAR 塞給 char 這件事的話,原 PO 的問題 07/06 00:19
→ stucode: 主要是不清楚 string 跟 string literal 的差別。 07/06 00:19
→ stucode: 比較看看下面兩行輸出的差異應該就知道問題在哪: 07/06 00:19
→ stucode: cout << GetFilePath() << endl; 07/06 00:19
→ stucode: cout << "C:\\LGPO\\Debug\\" << endl; 07/06 00:20
→ stucode: 不過刪除檔案可以像 2F 建議的用 std::filesystem 之類 07/06 00:20
→ stucode: 處理會比用 system() 來的好。 07/06 00:20
推 ando5566: OS authentification 可能也會造成失效 07/06 09:25
謝謝各位大大,找到原因了,因為我是直接做String 傳入system
而system真的直接判斷了內容為:
Del C:\\LGPO\\Debug\\LGPO_Machine_word.txt
因此系統才會看不懂,我把string GetFilePath()會產生雙斜線
改成了單斜線,使其產生變成:
Del C:\LGPO\Debug\LGPO_Machine_word.txt
這樣就有生效了@@ 真是奇怪
看來是唯有在 " " 內的,才要用雙斜線,不是的就要用單斜線
※ 編輯: jayzhuang (218.161.102.123 臺灣), 07/09/2019 10:08:04
→ jayzhuang: 謝謝大家,已解決 07/09 10:09
推 ando5566: \是用在特舒字元前 07/09 20:56
→ ando5566: 特殊 07/09 20:56