1

私のプログラムでは、実行可能ファイルをある場所から別の場所にコピーし、コピーしたファイルを実行しています。コピーしたファイルを実行すると、「許可が拒否されました」というエラーが表示されます。しかし、プログラムを再起動すると、ファイルは問題なく実行されます。誰かが問題を解決してくれますか? 以下のコードは単純ですが、問題を示しています。

void copyFile(string _from, string _to)
{
    std::ifstream  src(_from.c_str());
    std::ofstream  dst(_to.c_str());

    dst << src.rdbuf();
}

int main()
{
    string original("./exe_file");
    string dest_file("./exe_dir/exefile");

    system("./exe_dir/exefile");  //Fails on first run because exe_dir does not exist.

    //mkdir and copy the file.
    mkdir("./exe_dir",S_IRWXO | S_IRWXU | S_IRWXG);
    copyFile(original, dest_file);

    //Open the file and close it again to flush the attribute cache.
    int fd = open(dest_file.c_str(),O_RDONLY);
    close(fd);

    //The line below fails with system error code 2 (Permission denied) on exefile.
    return system("./exe_dir/exefile");
{

プログラムを実行する前に元のファイルに「chmod 777 exe_file」を使用しましたが、このプログラムを実行した後、宛先にも同じアクセス権があります。手動でうまく実行できます。そして、その後のプログラムの実行はすべて成功します。最初の実行で失敗するのはなぜですか?

4

2 に答える 2

0

Coderz、IDE でどのような問題が発生しているのかわかりませんが、これは私にとってはうまくいきます。

#include <iostream>
#include <fstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <cstdlib>

using namespace std;

void copyFile(string _from, string _to)
{
    std::ifstream  src(_from.c_str());
    std::ofstream  dst(_to.c_str());

    dst << src.rdbuf();
}

int main()
{
    string original("./exe_file");
    string dest_file("./exe_dir/exefile");

    system("./exe_dir/exefile");

    if (mkdir("./exe_dir", S_IRWXO | S_IRWXU | S_IRWXG))
        perror("mkdir");

    copyFile(original, dest_file);

    if (chmod("./exe_dir/exefile", S_IRWXU | S_IRWXG | S_IRWXO) == -1)
        perror("chmod");

    return system("./exe_dir/exefile");
}

exe_file は単純な Hello World バイナリであり、結果は次のようになることに注意してください。

sh: 1: ./exe_dir/exefile: not found
Hello World

コピーしたファイルの場所

-rwxrwxrwx  1 duck duck 18969 May  9 19:51 exefile

ディレクトリ内

drwxrwxr-x 2 duck duck   4096 May  9 19:51 exe_dir
于 2013-05-10T00:00:36.057 に答える
0

作成したファイルを閉じる必要があります。

cplusplus.comを参照してください: std::ifstream::close

于 2013-05-08T04:21:25.007 に答える