2017-01-03 9 views
1

ファーストをしようとしたときに権限拒否エラーを取得し、ファイルを削除するには、すべての皆さん、こんにちはの

私の問題は、私のプログラムが別のプログラムによって読み込まれ、帽子の後に私のプログラムは、ファイルを削除する必要がありますファイルを、作成していること、です。

次のコードを使用して、ファイルが存在するか、他のプログラムがファイルを使用しているかどうかを確認します。その後、ファイルを削除したい:

問題が発生する可能性のある人は誰も知りません。興味深いことに、これは他のファイルでも機能します。また、foo.txtも特別なアクセス権なしでこのプログラムによって作成されます。

感謝:)

/* just suppose the things with argc and argv work, I know it's uggly 
    but I need it as a call back function later in the code */ 

BOOL isFileRdy(char *filePath) 
{ 
    int argc = 1; 
    void *argv[1]; 
    argv[0]= (void*) filePath; 
    return isFileRdyCBF(argv, argc); 
} 


BOOL isFileRdyCBF(void *argv[], int argc) 
{ 
/* I used */ 
    char *filePath = (char*) argv[0]; 
    FILE *fDes = NULL; 
    BOOL _fileExists = FALSE; 
    BOOL _fileBussy = TRUE; 

    _fileExists = fileExists(filePath); 

    if(_fileExists) 
    { 
     fDes = fopen(filePath, "a+"); 
     if(fDes!=NULL) 
     { 
      _fileBussy = FALSE; 
      if(fclose(fDes)!=0) 
      { 
       printf("\nERROR could not close file stream!"); 
       printf("\n  '%s'\n\n", filePath); 
       return FALSE; 
      } 
     } 
    } 

    return (_fileExists==TRUE && _fileBussy==FALSE) ? TRUE : FALSE; 
} 
+2

次のコードとは完全に関係がありません。ハードコードされたファイル名のバックスラッシュはエスケープされません。 – WhozCraig

+2

\は特別な意味を持ち、特にWindowsプラットフォームの場合は特に意味があります。あなたが直面したエラーと一緒に完全なコードを提供してください。 –

+1

例: 'remove(" C:\\ test \\ foo.txt ");'これはまた動作するはずです: 'remove(" c:/test/foo.txt ");' –

答えて

2

あなたはそれが他のファイルのために働くことを言います。あなたのために働くこれらの道はどのように見えますか?バックスラッシュ\を正しく使用していない可能性があります。

Cでは、\tmeans the tab characterです。だからあなたはC:<TAB>testと書いた。バックスラッシュ文字\をC言語で実際に表現するには、\\と記述します。 (特殊コードを表現するために、様々な文字の前にバックスラッシュを置くこの事業は、「エスケープ」と呼ばれている。)

たとえば、代わりにremove("C:\test\foo.txt");のあなたはremove("C:\\test\\foo.txt");

これを記述しますが、また、動作するはずです:remove("c:/test/foo.txt");のWindowsもできるので、パスにバックスラッシュ\の代わりにスラッシュ/を受け入れます。

また、argvについてはRudi saidです。

3

これは、これはint main(int argc, char **argv)からの抜粋であることを考えると、問題の行(のようです:あなたがプログラムの最初の引数filePathにするプログラムの実行可能ファイルを割り当てることではなく、最初のパラメータをここで

char *filePath = (char*) argv[0]; 

argv[1]であるが、あなたは最初にそのargc >= 2をチェックする必要がありますが、静的なパスエントリを経由してファイルを削除しようとすると、第二\であなたの文字列に\ -signsをエスケープする必要があり

:。

remove("C:\\test\\foo.txt"); 
関連する問題