• ベストアンサー

st_ctimeを変更する方法

Linux Cプログラミングを行っておりますが解決できない問題がありますので質問させていただきます。 ファイルの状態変更日時st_ctime(statにて取得できる)を変更したいのですが方法がわかりません。 ファイルのst_ctimeをプログラム中から変更することは可能でしょうか? もし、変更可能ならばその方法を教えていただけますでしょうか? 環境は、Redhat7.3です。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • astronaut
  • ベストアンサー率58% (303/516)
回答No.1

難しいようですね. samba-jp ML の http://www.samba.gr.jp/ml/samba-jp/htdocs/20000620/6533.html から始まるスレッドが参考になるかも.特に http://www.samba.gr.jp/ml/samba-jp/htdocs/20000620/6549.html とか. 結局,ここでは st_ctime を変更する方法は無いとだけ言われていますが,まあ,全く手段が無いはずはないわけで … 全く自信は無いですが,カーネルのソースツリーを検索すると勉強になるかもとかいう話しなのかも. $ cd /usr/src/linux $ grep -r st_ctime * ディレクトリ fs/ 以下がそれっぽいですね. $ cd fs $ grep st_ctime * stat.c: tmp.st_ctime = inode->i_ctime; stat.c: tmp.st_ctime = inode->i_ctime; stat.c: tmp.st_ctime = inode->i_ctime; $ cd ext2 $ grep i_ctime * dir.c: dir->i_mtime = dir->i_ctime = CURRENT_TIME; dir.c: dir->i_mtime = dir->i_ctime = CURRENT_TIME; dir.c: inode->i_ctime = inode->i_mtime = CURRENT_TIME; ialloc.c: inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; inode.c: inode->i_ctime = CURRENT_TIME; inode.c: inode->i_mtime = inode->i_ctime = CURRENT_TIME; inode.c: inode->i_ctime = le32_to_cpu(raw_inode->i_ctime); inode.c: raw_inode->i_ctime = cpu_to_le32(inode->i_ctime); ioctl.c: inode->i_ctime = CURRENT_TIME; ioctl.c: inode->i_ctime = CURRENT_TIME; namei.c: inode->i_ctime = CURRENT_TIME; namei.c: inode->i_ctime = dir->i_ctime; namei.c: new_inode->i_ctime = CURRENT_TIME; あとは,utime(2) のソースを読んでみるとか.

dagane
質問者

お礼

ご回答ありがとうございました。 更新日付やアクセス日付が簡単に変えられるので、属性変更日付も簡単に変更できると思っていたんですが・・・ ご回答いただいた方法は、私のスキルではちょっとつらいので属性変更日付を使用しない方法を考えようと思います。 米?のサイトにこんな方法がありました。 1.マシンの日付を変更したい属性変更日付に更新する。 2.属性変更日が更新されるよな操作をする。(utime等) 3.マシンの日付を元に戻す。 コードは書いて実験は成功したのですが、途中で異常終了した場合等を考慮すると、危ないので使用することは止めました。

関連するQ&A

  • c言語でファイルのタイムスタンプを書き換えたい

    Linuxの環境でc言語を利用してファイルのアクセス日時と更新日時を指定したモノに書き換える方法はないでしょうか stat関数を利用して取得する方法まではわかったのですが書き換える方法がわかりません それともファイルのタイムスタンプはユーザーが勝手に書き換える事ができないものだったりするのですか?

  • ファイル情報の「月」の値を整数値で取得するには?

    こんにちは。私は30代の男性です。 下記のサイトに載っていたコーディングなのですが、 http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide93-1.html 「ctime(&filestat.st_mtime)」で取得した「Sat Apr 5」の「月」の値を整数で取得する方法を 考えています(例えば、「Sat 4 5」という感じで)。 何かいい方法はないでしょうか?アドバイスを頂けるとありがたいです。 よろしくお願いします。 #include <sys/types.h> /* stat(), struct stat */ #include <sys/stat.h> /* stat(), struct stat */ #include <stdio.h> /* fprintf(), printf() */ #include <errno.h> /* errno */ #include <string.h> /* strerror() */ #include <stdlib.h> /* exit() */ #include <time.h> /* time_t, ctime() */ int main(void) { struct stat filestat; char path[] = "/path/to/file"; time_t dtime; if(stat(path, &filestat) == -1) { fprintf(stderr, "* Error (%d) [stat: %s]\n", errno, strerror(errno)); exit(errno); } printf("Size: %ld\n", (long)filestat.st_size); printf("Last accessed: %ld, %s", filestat.st_atime, ctime(&filestat.st_atime)); printf("Last modified: %ld, %s", filestat.st_mtime, ctime(&filestat.st_mtime)); dtime = filestat.st_atime - filestat.st_mtime; printf("%ld\n", dtime); exit(0); } 実行例です。 Size: 86555 Last accessed: 1049485323, Sat Apr 5 04:42:03 2003 Last modified: 1049428803, Fri Apr 4 13:00:03 2003 56520

  • stat関数をJavaで実現するには?

    C言語をJavaで置き換える質問です。 C言語のプログラムで下記のようなファイルチェックを行っています。  struct stat st;  stat(file, &st);  if ((st.st_mode & 040000) == 0 ||    (st.st_mode & 020000) == 0) {    エラー処理  } 上記の処理をJavaではどのように実現できるでしょうか? 環境は下記の通りです。 OS:Solaris 9 J2SE 5.0 ご教授願います。

  • ファイルのアクセス日時取得を変更させずに取得する方法

    お世話になります。 プログラム上で、windows上にあるファイルのアクセス日時を取得したいのですが、WinAPIのFindFirstFile()、または、GetFileTime()を使って取得すると、「そのファイルのアクセス日時」ではなく、「WinAPIがそのファイルにアクセスした日時」が取得されてしまいます。 ファイルのアクセス日時をそのまま取得する方法についてご存知の方は是非ご教授ください。 対象となるのは、windows2000とwindowsXPで、言語はCまたはC++です。 なお、ファイル圧縮/解凍ソフトをいくつか実行してみたところ、アクセス日時が圧縮前のままのもの、圧縮したときのもの、解凍したときのものとありましたので、方法はあると思っています。 #リポジトリを触ればアクセス日時を凍結できるので、一時的にそうしておくとか? 以上、よろしくお願いします。

  • LINUXでC++開発する方法を教えてください。

    Windows上でVisual C++にて開発した経験があるのですが、LINUXは初心者です。 LINUX(RedHat5.2)上でC++を使いCUIプログラムを開発する方法を教えてください。 できれば有料の開発ツールを使わずにOS付属でないのでしょうか?

  • http://から始まるファイルの更新日時を取得するには

    自分のサーバー内にあるファイルの最終更新日時は statを使って取得できるようですが、 http://から始まるほかのサーバーにあるファイルの 更新日時を取得するにはどうすればいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • javaの中で環境変数を設定する。

    javaの記述内で環境変数を設定する事は出来るのでしょうか? osはredhat linuxです。 具体的にはJAVAからCのモジュールをSystem.loadLibraryで 読み込んでいますが、環境変数LD_LIBRARY_PATHから探しに行くと思います。 このCのモジュールのパスを外部ファイルに持たせ、変更できるようにしたいのです。 何か良い方法がありますでしょうか? 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • pthreadのスタックサイズ設定取得方法

    Linux(CentOS)で、C言語にてpthreadによるマルチスレッドプログラミングをしています。 各スレッドのスタックサイズを増やす方法と 該当スレッドのスタックサイズを取得する方法をおしえていただけませんでしょうか? 調べてみた限りでは、pthread_attr_setstacksizeが使えそうな気もしましたが、 設定方法がわかりませんでした。 また設定が正しく行われてるかを確認する方法がわかりませんでした。 Linuxのコマンドで実行中のプログラムのスタックサイズを取得するもの とかないのでしょうか? よろしくお願い致します。

  • 更新日時などを変更または参照する方法。

    ファイルを右クリックして作成日時/更新日時/アクセス日時などの情報は ファイルのどこに保存されているのか教えてください。 フリーソフトなどで変更できるソフトがあるのですがどうやって実現しているのか知りたいのです。ファイルをダンプして比較してみたのですがどこにもそれらしい所が見つかりませんでした。 もし可能であればプログラムからその属性を比較して更新日が違う場合エラーなどの処理をさせたいのですが、その方法などもアドバイスいただきたいです。

  • Perlで2GBを超える大きいファイルのファイルサイズを取得する方法ないですか?

    OS:WindowsXP SP2(ファイルシステムはNTFS) Perl:5.6.1 Perlで4GB以上のファイルに対して、一定の処理を行いたいのですが、 ファイルサイズを正しく取得することができません。 ファイルテストの-sを使う方法とstat関数を使う方法を試しましたが、 どちらも結果は同じで、取得した数値は正しいものではありません。 尚、同様の環境で2GB(正確な境界はわからないが大体このくらい) 以下のファイルであれば正しいファイルサイズをとることができます。 また、以下のような別の環境で試したところ、2GBを超えている ファイルでも問題なくファイルサイズを取得することができました。 OS:WindowsVista Perl:5.8.8 できれば、原因と解決法の両方を教えてもらいたいです。 そして、可能な限りPerlのみで解決したく、それもなるべく軽い処理で 行いたいです。 よろしくお願いします。