←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4314

utime()によるファイル更新日時の設定
投稿者---kolona(2005/07/16 05:07:03)


utime関数を利用して、ファイルの更新日時を自由に変更できるプログラムを作っているのですが、うまくいきません。
utimeの仕様として、関数が成功したら0を返し、失敗すると-1を返し、erronoを設定する、ということでしたので、返り値を調べたのですが、常に-1を返し、ファイルも変化ありません。ファイル名は、そのまま使ってファイルをオープンできるので間違っていません(確かに存在している)。ファイルは読み取り専用でもシステム属性でもありません。システム時刻を利用してutimebufのメンバにtime_t型の値を入れているのでおそらくこれも問題ありません。utimeのメンバは以下の2つだけなので、パラメータの代入し損ないもなさそうです。
struct utimbuf
{
time_t actime; /* access time (used on NTFS) */
time_t modtime; /* modification time */
};

そして、失敗した後にerrno の値を調べると、「No such process」が表示されます。(ただし、ファイルを開いた後だと「ERROR 0」と表示されるので、errnoの使い方か初期化方法に問題があるかもしれません。)
No such process はkillなどの関数ででるらしいのですが、utimeで出るerrnoの値は

EACCES ファイルが存在しない
EINVAL times引数が無効
EMFILE 開いているファイルが多すぎる
ENOENT ファイル名またはパス名が見つからない

の4つらしいことが本(C/C++実践プログラミングリファレンス p169)に書いてあったので、何が問題なのかわからなくなっています。

どなたか、errno や utime 等の使い方でまずいところ、間違っているところを指摘していただけるとありがたいです。
環境は
win ME
Borland c++ compiler 5.1
FAT32

以下に問題のソースと同じ働きをするコードを載せます。

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <time.h>
#include <utime.h>
#include <sys\stat.h>

#define MAXN (256)

int main(void){

  FILE *f1;
  int flag;
  char fm1[MAXN];
  
  time_t tt;
  struct utimbuf ut;
  struct stat st;
  struct tm *t;
  
  
  strcpy(fm1,"D:\\work\\utime");
  printf("\n%s\n",fm1);
  //f1=fopen(fm1,"rb");
  //if(f1==NULL){
    //printf("ファイルの存在を確認できない。\n");perror("エラー");
  //}
  //else{
    //printf("ファイルの存在を確認。\n");
    //fclose(f1);
  //}
  time(&tt);//現在のシステム時刻をtime_t型(経過秒数)で取得する
  t=localtime(&tt);//ローカル時刻で補正し,time_tからstruct tmに変換する
  
  printf("tm_sec=%d\n",(t->tm_sec));
  
  printf("ローカル時刻: %s\n",ctime(&tt));
  //t->tm_hour=1;
  //t->tm_min=10;
  //t->tm_sec=34;
  //ut.actime=0;
  ut.actime=mktime(t);
  ut.modtime=mktime(t);//struct tmからtime_tに変換する
  
  flag=utime(fm1,&ut);
  if(flag==0){printf("更新時刻変更成功%s\n",fm1);}
  if(flag==-1){printf("更新時刻変更失敗\n%s\n",fm1);}
  perror("エラー");
  printf("\n");
  printf("%s\n",strerror(errno));
  stat(fm1,&st);
  printf("更新時刻: %s\n",ctime(&st.st_mtime));
  
  gets(fm1);
  return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:utime()によるファイル更新日時の設定 4319 まきじ 2005/07/16 20:01:02


No.4319

Re:utime()によるファイル更新日時の設定
投稿者---まきじ(2005/07/16 20:01:02)


>そして、失敗した後にerrno の値を調べると、「No such process」が表示されます。(ただし、ファイルを開いた後だと「ERROR 0」と表示されるので、errnoの使い方か初期化方法に問題があるかもしれません。)
>No such process はkillなどの関数ででるらしいのですが、utimeで出る

Borland C++ Compiler 5.1 と Visual C++ Toolkit 2003 で
コンパイルして実行してみたところ、正常に動作しましたが?

strerror(errno) は
bcc32 の場合、Error 0 と
vctk2003 の場合、no error と
返されていました。
ファイルの更新日も変更されていました。


この投稿にコメントする

削除パスワード

No.4330

Re:メモリの一括解放関数
投稿者---kolona(2005/07/16 22:14:58)


>Borland C++ Compiler 5.1 と Visual C++ Toolkit 2003 で
>コンパイルして実行してみたところ、正常に動作しましたが?
>
>strerror(errno) は
>bcc32 の場合、Error 0 と
>vctk2003 の場合、no error と
>返されていました。
>ファイルの更新日も変更されていました。

全く同じコードがwindows Meでは必ず更新に失敗します。
同コードをwinXP上でコンパイル、実行すると、正常に更新されます。ファイルパスを変えて、FAT32 ファイルシステムのリムーバブルディスク上にあるファイルを指定しても、更新は成功します。どうも、win Me 上でのみ更新に失敗しているようですが、MSDNでは98,Me,2000,XPで動作すると書いています。よって対応はしていると思うのですが、失敗する理由が思い当たりません。
どなたか教えてください。


この投稿にコメントする

削除パスワード

No.4331

Re:utime()によるファイル更新日時の設定
投稿者---kolona(2005/07/16 22:19:14)


題名を間違いました。正しくは
Re:utime()によるファイル更新日時の設定
でした。


>Borland C++ Compiler 5.1 と Visual C++ Toolkit 2003 で
>コンパイルして実行してみたところ、正常に動作しましたが?
>
>strerror(errno) は
>bcc32 の場合、Error 0 と
>vctk2003 の場合、no error と
>返されていました。
>ファイルの更新日も変更されていました。

全く同じコードがwindows Meでは必ず更新に失敗します。
同コードをwinXP上でコンパイル、実行すると、正常に更新されます。ファイルパスを変えて、FAT32 ファイルシステムのリムーバブルディスク上にあるファイルを指定しても、更新は成功します。どうも、win Me 上でのみ更新に失敗しているようですが、MSDNでは98,Me,2000,XPで動作すると書いています。よって対応はしていると思うのですが、失敗する理由が思い当たりません。
どなたか教えてください。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity