8

私は(非)アーカイブツールを作成しており、その設計方法では、特別な属性を調べてこのアイテムが実際にはシンボリックリンクであると判断する前に、まずアーカイブから通常のファイルを作成します。

注:ファイルのシンボリックリンク作成したいと誤解する人が増える前に。いいえ、シンボリックリンクデータ、つまりそのパスをファイルに書き込みます。次に、これがシンボリックリンクであることをファイルシステムに通知します。

私はこれをOSXで開発してきました。そこでは、タイプとクリエーターのコードを適宜設定するだけで、通常のファイルをシンボリックリンクに変えることができます。

今、私はこのコードをLinuxでも動作させるのが好きです。だから私はそこで同様の方法を見つけるのが好きです。

シンボリックリンクを作成する通常の方法はsymlink()関数を呼び出すことですが、OSXのBSDシステムで可能であるように、通常のファイルをシンボリックリンクに変更する方法もあるのではないかと思います。作業コードをあまりリファクタリングする必要はありませんか?

st_modeの最上位ビットでファイルタイプを返すlstat()があります。ここで、このモードフィールドに類似のセッター関数もあるのではないかと思います。

4

3 に答える 3

4

あなたが説明しているように、Linuxにはこれを行う方法があるとは思いません。IIRC、ファイルシステムはシンボリックリンク情報を通常のファイルではなくiノードテーブルに保存するため、ファイルをリンクに直接変換する方法はありません。

シンボリックリンクのパスがファイル内に保存されている場合は、パスを読み取り、ファイルを削除して、その場所にシンボリックリンクを作成してみませんか?

于 2010-02-25T00:07:43.430 に答える
3

私がbmarguilesの答えへのコメントとして書いたことを示して、

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char **argv) {
    char *buffer = 0, *name = 0;
    int i;
    for (i = 1; i < argc; i++) {
        struct stat st;
        int fd = open(argv[i], O_RDONLY);
        fstat(fd, &st);
        buffer = realloc(buffer, st.st_size + 1);
        read(fd, buffer, st.st_size);
        close(fd);
        buffer[st.st_size] = '\0';
        name = realloc(name, strlen(argv[i]) + 2);
        sprintf(name, "%s~", argv[i]);
        symlink(buffer, name);
        rename(name, argv[i]);
    }
    free(buffer);
    free(name);
    return 0;
}
$ vi f2s.c
..。
$ cc -o f2s f2s.c
$ echo-n/>テスト
$./f2sテスト
$ls-lテスト
lrwxrwxrwx 1 me me 1 Feb 24 23:17 test-> /
$ echo -n /> test2
$ strace ./f2s test2
open( "test2"、O_RDONLY)= 3
fstat(3、{st_mode = S_IFREG | 0644、st_size = 1、...})= 0
read(3、 "/"、1)= 1
close(3)= 0
symlink( "/"、 "test2〜")= 0
rename( "test2〜"、 "test2")= 0

これは単なるデモンストレーションです。それは本当により多くのエラー処理とおそらくより良い一時ファイル名を必要とします。

于 2010-02-25T04:20:55.320 に答える
1

いいえ、一方を他方に変えることはできません。ファイルを強制終了するにはリンクを解除してから、代わりにシンボリックリンクを作成するためにシンボリックリンクを作成する必要があります。

于 2010-02-25T00:08:20.320 に答える