2016-04-05 11 views
0

Windows上にサーバがありますが、実際にはLinuxサーバ上にあるネットワークドライブがあります。プログラムは、同じ名前(信号)の同じ場所にあるファイルを削除する必要がありますが、ローカルドライブ上にある場合は正常に動作しますが、ネットワークドライブ上で実行しているとファイルを削除しない場合があります。関数はすべてが正常になったことを返します(ファイルが削除されたことを意味します)。私はremove_unlinkDeleteFileAと試してみましたが、問題はまだ続きますが、いつでも完全にランダムに削除されず、このままになります。VS2015 Windows上のファイルからLinuxを削除する

コードは本当に簡単です:

bool File::Delete() 
{ 
    if(isFile() && exist()) 
    { 
     return DeleteFileA(filename.c_str()) != 0 ? true : false; 
    } 
    else 
     return false; 
} 

これは必ずしもランダムに、例えばそれが権限を持っていないならば、それは失敗(と毎回失敗すると、ファイルが削除されていない場合でもtrueを返します)、誰かが私にアイデアを与えることができますか?私は選択肢を使い果たした:(

編集:@ExcessPhaseに おかげで、MOVEFILEが実際にエラーを検出するように、それはとても削除する前に名前を変更しても問題「ERROR_FILE_NOT_FOUND」を検出することができ、思わ

他のもの:これをランダムな問題は、ファイルがLinuxサーバから作成されたときにのみ発生します。ウィンドウからファイルを作成すると、それらは常に削除されます。さらに:プログラムが削除できないファイルがあり、 Windowsでは、これまでに削除できなかったものを検出して削除します。

Edit2:答えがいっぱい:linuxのファイル名testTESTは異なっていますが、Windowsでは同じです。この問題は、ケースが一致しないときにランダムに表示されるようです。しかし、それは非常にランダムなので、私はよく分かりません。

+0

は、コマンドラインまたはファイルエクスプローラツールを使用してリモートドライブから削除するために利用可能なファイルがある何かを試してみてください?あなたはファイルをチェックして、アクセス許可をドライブしていますか?チェックファイルの存在は失敗しても失敗しないために回避されます。 – oklas

+0

誰かがファイルをオープンしている可能性があります - Sambaではなく、LINUXの直下にあります。私はちょうど作成された.dllファイルを移動するときに同じ問題を抱えています - SambaでMoveFileシステムコールは、私が覚えている限り(または許可が拒否された)ファイルを開いているということを知らせません。 –

+1

DeleteFile()をMoveFile()とDeleteFile()に置き換えてみます。最初にファイルを新しい名前(単にファイル名にドットを付加したもの)に移動し、新しいファイル名を削除しようとします。 –

答えて

2

私はこの問題が、Windows用のSMBプロトコルを実装しているLinux上のSambaサービスにあると考えています。 DeleteFile関数は、ファイルを削除するためにSMBサーバー(Windowsではサーバーサービス)を要求するだけです。成功はSambaによって返されます。

+0

ファイルを移動するとエラーが検出されるため、そうであるようです。私の質問を編集しました。 – Silencer