web-dev-qa-db-ja.com

ファイルの変更とアクセス時間?

ファイルアクセス時間を変更せずにファイル変更時間を変更することはできますか?

5
Ankit

utime/utimes syscall を使用すると、アクセス時間と変更時間を任意に設定できます。したがって、ファイルをstatしてから、utimeを使用してそのうちの1つだけを変更できます。から manページ

[〜#〜]名前[〜#〜]

utime、utimes-ファイルの最終アクセスと変更時刻を変更します

[〜#〜]概要[〜#〜]

   #include <sys/types.h>
   #include <utime.h>

   int utime(const char *filename, const struct utimbuf *times);

   #include <sys/time.h>

   int utimes(const char *filename, const struct timeval times[2]);

[〜#〜]説明[〜#〜]

Utime()システムコールは、filenameで指定されたiノードのアクセス時間と変更時間をそれぞれ時間のactimeフィールドとmodtimeフィールドに変更します。

TimesがNULLの場合、ファイルのアクセス時間と変更時間は現在の時間に設定されます。

タイムスタンプの変更は、プロセスに適切な権限があるか、有効なユーザーIDがファイルのユーザーIDと等しいか、時刻がNULLでプロセスにファイルへの書き込み権限がある場合に許可されます。

[…]

5
derobert

私は方法を発見しました。 GNU stat(stat (GNU coreutils) 8.19)を使用して、ファイルの「アクセス」、「変更」、および「変更」のタイムスタンプを確認しました。

ファイルに対して_chmod u+x_を実行することで、「変更」時間を更新できます。 「変更」と「アクセス」のタイムスタンプは同じままでした。

catを実行することで、「Access」ファイルを更新できます。 「変更」と「変更」のタイムスタンプは同じままでした。

open(filename, O_WRONLY);を実行し、ファイル記述子に1バイトを書き込み、結果のファイル記述子にclose(filedes);を書き込む小さなCプログラムを作成しました。 statは、サブジェクトファイルの「アクセス」タイムスタンプに変更を示しませんでしたが、「変更」および「変更」タイムスタンプが更新されました。

これはすべて、Ext4ファイルシステム上のごく最近更新されたArchLinuxラップトップであるLinux3.5.4の下にありました。

小さなCプログラム:

_#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int
main(int ac, char **av)
{
        int fd = open(av[1], O_WRONLY);
        if (fd >= 0)
        {
                char buf[12];
                write(fd, buf, 1);
                if (close(fd) < 0)
                        fprintf(stderr, "Problem closing file: %s\n",
                                strerror(errno));
        } else {
                fprintf(stderr, "Problem opening \"%s\": %s\n",
                        av[1], strerror(errno));
        }
        return 0;
}
_
4
Bruce Ediger

touch-m引数を含めます。デフォルトでは、touchコマンドはアクセス時間と変更時間の両方を変更します。 -aまたは-mのいずれかを渡すと、指定された時間のみが変更されます。

FS with noatime属性を使用して再マウントし、ファイルを変更して、再度マウントします。

2
daisy