2017-01-30 7 views
3

私のCコードでファイルのリンクを解除するのに苦労しています。コードをコピーした後、ファイルシステムからファイルを削除したいと思います。Linuxでファイルをコピー/移動し、Linuxでシステムコールを使用するアプリケーション

declared here extern int unlink (const char *__name) __THROW __nonnull ((1)); 
#include <stdio.h> 
#include <unistd.h> 
#include <errno.h> 
#include <fcntl.h> 
int main(int argc, char * args []) 
{ 
    int infile, outfile; 
    int numofbytesread; 
    char buffer[20]; 

    infile = open(args[1], O_RDONLY, 0700); 

    if (infile == ENOENT) 
    { 
      printf("Could not find file"); 
      return 1; 
    } 

    outfile == open(args[2], O_WRONLY | O_CREAT, 0700); 

    while ((numofbytesread = read(infile, buffer, 20))){ 
      write(outfile, buffer, numofbytesread); 
    } 
    close(infile); 
    close(outfile); 

    unlink(); 
return 0; 
} 
+3

コードをテキスト形式でコピーして貼り付け、投稿に含めてください。画像をリンクしないでください。 –

+0

問題の説明はありませんでした。 unlink(oldfile)を追加するだけですか? http://www.gnu.org/software/libc/manual/html_node/Deleting-Files.html – Thomas

+1

スクリーンショットにはJPEGを使用しないでください。見た目が醜いです。代わりにPNGを使用してください。 (これは一般的なアドバイスですが、画像の代わりにテキストを投稿する方が良い) –

答えて

4

をコピーした後、あなたはunlinkシステムコールを呼び出すことができます。私は言うエラーを取得しています。

ただし、ファイルを削除する前にコピーが成功したかどうかを必ず確認してください。

参考:unlinkは、ファイルパスがかかるためhttps://www.gnu.org/software/libc/manual/html_node/Deleting-Files.html

+0

これはエラーの問題を助けましたありがとうございました!..私は別の質問があります。コード内にcp cmdを実装する方法はありますか?それでは、単にコピーcmdを実行してから、コピーが作成された後に削除/リンク解除を行います。ですから、私がする必要があるのは./filename file1 file2です。 – compma

+1

@compma:これは、ファイルシステム間でファイルを移動する必要がある場合に、 'mv'コマンドがすでに行っていることです(パーミッションを適切に保存するだけです)。なぜあなたは車輪を再発明していますか? – ShadowRanger

3

あなたがやろうとしているすべてのファイルを削除するには、コールリンク解除された場合、これは、動作するはずです。したがって、入力ファイルのパスが有効で、ファイルシステムで読み込み専用でない場合、これはうまくいくはずです。私はそれを試して、それは私のために働く。第1引数で指定されたファイルを第2引数で指定されたファイルにコピーした後、入力ファイルを削除します。また、エラー処理を修正しました。

#include <stdio.h> 
#include <unistd.h> 
#include <errno.h> 
#include <fcntl.h> 

int main(int argc, char *args[]) { 
    int infile, outfile, readcnt; 
    char buffer[20]; 

    if ((infile = open(args[1], O_RDONLY, 0700)) < 0) { 
     perror("Error openning input file"); 
     return -1; 
    } 

    if ((outfile = open(args[2], O_WRONLY | O_CREAT, 0700)) < 0) { 
     perror("Error opening output file"); 
     return -1; 
    } 

    while ((readcnt = read(infile, buffer, 20)) > 0) { 
     if (write(outfile, buffer, readcnt) < 1) { 
      perror("Error writing to output file"); 
      return -1; 
     } 
    } 

    close(infile); 
    close(outfile); 

    if (unlink(args[1]) < 0) { 
     perror("Error unlinking file"); 
     return -1; 
    } 

    return 0; 
} 
+0

ありがとうございました...これは愚かな質問かもしれませんが、retvalは何をしていますか?コード内にcp cmdを実装する方法はありますか?それでは、単にコピーcmdを実行してから、コピーが作成された後に削除/リンク解除を行います。ですから、私がする必要があるのは./filename file1 file2です。 – compma

+0

システムコールは通常、エラーを示すために-1を返し、errnoにエラーの理由(数値コード)を設定します。特定の理由で特定のことを行う必要がなく、失敗が致命的な場合は、単に 'perror()'を実行して終了すると、人間/エラーのテキストの理由。 retvalは戻り値を取得します。 'read()と' write() 'はエラーの場合は-1を返し、読み書きされたバイトがある場合は正の値を返します。 – clearlight

+0

[perror()のマニュアルページ](https://linux.die.net/man/3/perror) – clearlight

関連する問題