Bagaimana aplikasi Mac dapat melacak lokasi file?

18

Saya mengamati perilaku seperti ini di Mac saya:

  • Buka PDF dengan PDF Expert, buat beberapa perubahan pada file, pindahkan file dalam Finder, simpan dalam PDF Expert dan itu akan disimpan dengan benar ke tempat baru.
  • Buka shell di direktori like ~/foo, trash direktori dengan aplikasi lain dan pwd shell dengan benar output ~/.Trash/foo.

Apa yang terjadi di bawah tenda? Kasus-kasus ini tampaknya menunjukkan aplikasi tidak hanya memegang jalur absolut dari file seperti emacs (apakah saya benar dengan ini?), Atau apakah itu mekanisme yang sama sekali berbeda?

nichijou
sumber

Jawaban:

21

Macos memiliki /.vol/sistem khusus yang dipetakan ke direktori dan file yang sebenarnya. File dan direktori dapat diakses melalui /.vol/<device_id>/<inode_number>, di mana pun file berada pada sistem file.

Ini adalah sistem kecil yang bagus.

Jadi, program misalnya dapat memperoleh nomor inode /Users/jdoe/someFile.txtdan kemudian membukanya melalui /.vol/12345/6789(dalam hal ini, id perangkat adalah 12345 dan nomor inode 6789). Anda kemudian pindah ke /Users/jdoe/someFile.txtmana saja yang Anda inginkan (pada volume yang sama) dan semuanya berfungsi. Anda bahkan dapat menulis skrip shell yang mendukung ini magic.

ls -di <file> untuk mendapatkan nomor inode.

$ ls -di /User/jdoe/someFile.txt
6789 /User/jdoe/someFile.txt

EDIT:

Anda menggunakan statuntuk mendapatkan id volume dan nomor inode, sesuai dengan jawaban terkait seperti yang disorot oleh IMSoP.

GetFileInfo /.vol/12345/6789akan mengembalikan lokasi file yang sebelumnya terletak di /Users/jdoe/someFile.txt.

Lihat /programming/11951328/is-there-any-function-to-retrieve-the-path-associated-with-an-inode untuk informasi lebih lanjut.

sampah
sumber
1
Menurut jawaban yang ditautkan, statadalah perintah yang lebih berguna di sini daripada ls -di, karena ini memberi tahu Anda volume / ID perangkat serta ID file / nomor inode.
IMSoP
4
Di Debian saya tidak punya /.vol/dan ini masih terjadi (walaupun saya perlu pwd -P, hanya kemudian output dari polos pwddiperbarui). Saya kira program tidak harus membuka file melalui jalur khusus apa pun karena secara umum mereka mendapatkan (dan menyimpan) deskriptor file yang dipetakan ke inode oleh kernel. Saya kira di Mac /.vol/juga tidak penting.
Kamil Maciorowski
Jadi, jika Anda memindahkan file ke disk lain, skema ini rusak.
Joel Coehoorn
1
@ JoelCoehoorn Ya, tetapi secara teknis Anda tidak dapat memindahkan file ke disk lain. Anda dapat menyalinnya ke disk lain, lalu menghapusnya, dan ada cara pintas untuk melakukan ini sebagai "satu langkah", tetapi itu masih merupakan salin dan hapus, bukan gerakan, jadi, secara teknis file yang berbeda.
ibrewster
1
Banyak editor teks membaca file yang diberikan, menutupnya, bekerja dengan salinannya dan menyimpannya ke jalur yang sama, sehingga mereka membuat ulang file di lokasi lamanya. Tetapi mereka mungkin membiarkan file terbuka sepanjang waktu dan menulis di bagian paling akhir. My bashon Debian melakukan itu. Saya menjalankan exec 3<>foo, kemudian pindah foodalam sistem file yang sama echo whatever >&3,, lalu memeriksa foodi lokasi baru - dan itu berubah. Meskipun bashtidak dapat mencari di dalam file, program lain secara umum bisa. Maksud saya /.vol/adalah tidak penting, program dapat dengan mudah bekerja seperti ini tanpanya. Atau saya tidak mengerti apa bedanya.
Kamil Maciorowski
1

Jawaban di bawah ini salah (lihat komentar). Tolong abaikan


Selain jawaban baik yang diberikan oleh kuburan, kemungkinan program Anda hanya memegang file handle , yang tidak tergantung pada lokasi file di pohon direktori (dan pada sistem Unix bahkan bertahan penghapusan file, setidaknya sampai Anda menutupnya. ).

Pegangan file pada dasarnya adalah akses langsung ke file, terlepas dari di mana atau seberapa sering (dalam kasus hardlink) itu ada dalam struktur direktori.

Tom
sumber
Tidak, Anda juga tidak mengerti, saya pikir ... lihat komentar saya di @KamilMaciorowski. Menangani file tidak berubah, ketika Anda kemudian menyimpan file, file baru dibuat di lokasi asli .... tidak begitu pada makro!
thecarpy
1
Anda benar, itu sangat tidak terduga dan sangat tidak seperti Unix. :(
Tom
Setuju dan terangkat!
thecarpy
0

Sementara saya tidak yakin mengapa makro menggunakan ini alih-alih fungsi C standar, dengan anggapan apa yang saya baca tahun lalu di "Mac OS X Unleashed" benar, ternyata saya belajar sesuatu yang baru, lagi.

Silakan lihat program C sederhana berikut:

#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    struct timespec ts;
        ts.tv_sec = 10;
        ts.tv_nsec = 0;
    FILE * fp;

    fp = fopen("file.txt", "a");
    int f = fileno(fp);

    if (fp == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }

    struct stat file_stat;
    int ret;
    ret = fstat (f, &file_stat);
    printf("inode number is %d\n", file_stat.st_ino);
    nanosleep(&ts, NULL);

    printf("Finished sleep, writing to file.\n");

/* print some text */
    const char *text = "Write this to the file";
    dprintf(f, "Some text: %s\n", text);

/* print integers and floats */
    int i = 1;
    float py = 3.1415927;
    dprintf(f, "Integer: %d, float: %f\n", i, py);

/* printing single characters */
    char c = 'A';
    dprintf(f, "A character: %c\n", c);

    close(f);
}

Kompilasi program, jalankan di latar belakang dan dengan cepat mv file.txt file2.txtSEBELUM program mencetak "Selesai tidur, menulis ke file." (Anda punya 10 detik)

Perhatikan bahwa file2.txtmemiliki output dari program Anda meskipun dipindahkan sebelum teks dicetak ke file (melalui deskriptor file).

$ gcc myfile.c
$ ./a.out &
[1] 21416
$ inode number is 83956
$ ./mv file.txt file2.txt
$ Finished sleep, writing to file.
[1]+  Done                    ./a.out
$ cat file2.txt
Some text: Write this to the file
Integer: 1, float: 3.141593
A character: A

PENOLAKAN: Saya belum memotong daftar "sertakan", ini dengan cepat diretas bersama untuk membuktikan suatu hal.

sampah
sumber