Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > мажет ли фаил exe узнать дату своего воздания


Автор: Гость_Наташа 14.10.2004, 12:54
мажет ли фаил exe узнать дату своего воздания. если да то как и в какой форме.

Автор: sergejzr 14.10.2004, 13:00
Если ты его сама писала smile.gif

вставь куда нибудь:
Код

cout<<__DATE__<<endl;

Вообще __DATE__ это строка
Код
char*
и работать ты можешь с ней тоже как со строкой smile.gif

Автор: Гость_Наташа 14.10.2004, 13:34
я пишу в visual c++ как правельно написать строку чтоб получить дату и в какой форме палучиная дата (т.е. день\месяц\год) или по другому

Автор: SSlavon 14.10.2004, 14:05
CTime t = CTime::GetCurrentTime(); получение системного времени
t.Format("%m.%d.%y") соответственно перевод в формат строки

Автор: sergejzr 14.10.2004, 14:08
Месяц день год т. есть сегодня:
Oct 14 2004

Вот тебе игрушка smile.gif Дата разнообразными способами. smile.gif Дополняй, может я забыл какой нибудь biggrin.gif
Код

#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

/*Функция возвратит номер месяца по его имени :)*/
long get_month(const char*month_str);
int main()
{
/*представим день,месяц, год словами*/
char month_str[4];
char day_str[3];
char year_str[5];
/*А так же числами*/
int month;
int day;
int year;


/*
Здесь коплилятор заменит для нас __DATE__ на строку с датой
например сегодня: Oct 14 2004
*/
char* date=__DATE__;

/*Вот так будет выглядеть дата, подаренная компилятором*/
printf("Date of birth as compiler string:\t %s\n",date);

/*разобьём строку на день, месяц,год*/
memcpy(month_str,date,3);
month_str[3]=0;

date+=4;
memcpy(day_str,date,2);
day_str[2]=0;

date+=3;
memcpy(year_str,date,4);
year_str[4]=0;

/*Эта распечатка уже гибче*/
printf("Date of birth as our string:\t\t %s.%s.%s\n",day_str,month_str,year_str);

/*Ну и сделаем числа для удобного пользования*/
month=get_month(month_str);
day=atol(day_str);
year=atol(year_str);

/*А так совсем удобно :)*/
printf("Date of birth as numbers:\t\t %i.%i.%i\n",day,month,year);


/*И ещё раз всё удовольствие потоками :)*/
cout<<endl;
cout<<__DATE__<<endl;
cout<<day_str<<" "<<month_str<<" "<<year_str<<endl;
cout<<day<<" "<<month<<" "<<year<<endl;


return 0;
}

/*Функция возвратит номер месяца по его имени :)*/
long get_month(const char* month_str)
{
int month;

/*Тут в month_array соотношения, имена - число*/
const char * const month_array[]=
 {
  "Jan",
  "Feb",
  "Mar",
  "Apr",
  "May",
  "Jun",
  "Jul",
  "Aug",
  "Sep",
  "Oct",
  "Nov",
  "Dec"
 };

/*Смотрим, какой же наш месяц по счёту*/
for(month=0; month<12; month++)
{
 if(strcmp(month_str, month_array[month])==0)
 {
  return month;
 
 }
}
/*до этого места функция не дойдёт, но надо же компилятор успокоить :)
А вдруг кто нибудь передаст в неё не название месяца, а ерунду какую нибудь :)?*/
return 99;
}

Добавлено @ 14:08
Цитата(SSlavon @ 14.10.2004, 13:05)
CTime t = CTime::GetCurrentTime(); получение системного времени t.Format("%m.%d.%y") соответственно перевод в формат строки

Таким образом ты получишь время выполнения программы, а не время её создания smile.gif

Автор: sergejzr 14.10.2004, 14:30
Наташа, регистрируйтесь у нас пожалуйста smile.gif Вам откроются новые возможности smile.gif

Автор: Гость_Наташа 14.10.2004, 16:49
спасибо Сергей, но мне надо чтоб если програму переписать то временим создания было время переписки а __DATE__ выдает только время парваначального создания.

Автор: Royan 14.10.2004, 17:07
Если программу переписать, придется ее перекомпилировать, а в макросе __DATE__ хранится информация о времени компиляции: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/prepr_18.asp

Автор: sergejzr 14.10.2004, 17:35
Первый аргумент содержит имя самого файла. По нему можно узнать о файле всё, что знает ОС. Так же и время smile.gif

Код

#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

int main(int argc,char**argv)
{

struct _stat buf;
struct tm *filedate;

/* Get data associated with this file, check if statistics are valid: */
if(_stat(argv[0], &buf) != 0)
{
 cout << "Problem getting information" << endl;
 return -1;
}


cout<<argv[0]<<" "<<buf.st_mtime<<endl;
}


Вот только как это(buf.st_mtime) в нормальный формат перевести... Надо искать.. я сейчас очень занят. Может другие участники помогут. Я уверен smile.gif

Автор: Гость_Наташа 14.10.2004, 18:25
Сергей, я работаю в visual c++ с MFC и там не изпользуют argv.

Автор: sergejzr 14.10.2004, 18:30
Ты имеешь ввиду MFC? Так там скорее всего какой нибудь Application.path или что то в этом роде.
А остальное с каким нибудь
f=CFile(Application.path);
f.creationDate();

Я не занимался MFC, сорри smile.gif
Но посмотрю. Только сперва скажи, это то, что тебя интересовала или я опять ошибся? smile.gif

Автор: Гость_Наташа 14.10.2004, 18:41
спасибо Сергей, ты правельно понял я работаю с MFC, но я подчоркиваю если фаил переписали мне надо время переписки.

Автор: Guest 14.10.2004, 18:51
а после полечения имени делать как ты указал раньще? т.е.

struct _stat buf;
struct tm *filedate;

/* Get data associated with this file, check if statistics are valid: */


if(_stat(path,&buf) != 0) //if(_stat(argv[0], &buf) != 0)
{
cout << "Problem getting information" << endl;
return -1;
}


cout<<argv[0]<<" "<<buf.st_mtime<<endl;
}

Автор: sergejzr 15.10.2004, 00:22
Вот короче расформатирование smile.gif эту демку можно запустить как есть, а для твоего MFC модифицировать smile.gif
Код

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

/*Функция возвратит номер месяца по его имени :)*/
long get_month(const char*month_str);
/*Функция возвратит номер дня недели по его имени :)*/
long get_weekday(const char* weekday_str);

int main(int argc,char**argv)
{


/*представим день недели, число,месяц,год,час,минуты, секунды словами*/
char weekday_str[4];
char month_str[4];
char day_str[3];
char year_str[5];
char hours_str[3];
char minutes_str[3];
char seconds_str[3];

/*А так же числами*/
int weekday;
int month;
int day;
int year;
int hours;
int minutes;
int seconds;
char* date=NULL;
char* path=argv[0];//Ну тут достанешь путь из своей MFC :)

struct _stat buf;
/* Get data associated with this file, check if statistics are valid: */
if(_stat(path, &buf) != 0)
{
 cout << "Problem getting information" << endl;
 return -1;
}

date=ctime(&(buf.st_mtime));
/*date теперь: Thu Oct 14 23:16:36 2004*/

cout<<path<<" "<<date<<endl;


/*
Здесь коплилятор заменит для нас __DATE__ на строку с датой
например сегодня: Oct 14 2004
*/

/*Вот так будет выглядеть дата, подаренная компилятором*/
printf("Date of birth as string:\t %s\n",date);

memcpy(weekday_str,date,3);
weekday_str[3]=0;
date+=4;

/*разобьём строку на день, месяц,год*/
memcpy(month_str,date,3);
month_str[3]=0;

date+=4;
memcpy(day_str,date,2);
day_str[2]=0;

date+=3;
memcpy(hours_str,date,2);
hours_str[2]=0;

date+=3;
memcpy(minutes_str,date,2);
minutes_str[2]=0;

date+=3;
memcpy(seconds_str,date,2);
seconds_str[2]=0;

date+=3;
memcpy(year_str,date,4);
year_str[4]=0;

/*Эта распечатка уже гибче*/
printf("Date of birth as our string:\t\t %s:%s:%s %s %s.%s.%s\n",hours_str,minutes_str,seconds_str,minutes_str,weekday_str,day_str,month_str,year_str);

/*Ну и сделаем числа для удобного пользования*/
weekday=get_weekday(weekday_str)+1;//дни будут начинатся с 0, поетому добавлю 1 :)
month=get_month(month_str);
day=atol(day_str);
year=atol(year_str);
hours=atol(hours_str);
minutes=atol(minutes_str);
seconds=atol(seconds_str);


/*А так совсем удобно :)*/
printf("Date of birth as numbers:\t\t %i:%i:%i weekday %i %i.%i.%i\n",hours,minutes,seconds,weekday,day,month,year);

//А вот тут надо удалить указатель :)
delete date;
return 0;
}
/*Функция возвратит номер дня недели по его имени :)*/
long get_weekday(const char* weekday_str)
{
static char* wday_name[] =
{
 "Mon",
 "Tue",
 "Wed",
 "Thu",
 "Fri",
 "Sat",
 "Sun"
   };
int wday;
/*Смотрим, какой же наш день по счёту*/
for(wday=0; wday<12; wday++)
{
 if(strcmp(weekday_str, wday_name[wday])==0)
 {
  return wday;
 
 }
}
return 99;
}
/*Функция возвратит номер месяца по его имени :)*/
long get_month(const char* month_str)
{
int month;

/*Тут в month_array соотношения, имена - число*/
const char * const month_array[]=
 {
  "Jan",
  "Feb",
  "Mar",
  "Apr",
  "May",
  "Jun",
  "Jul",
  "Aug",
  "Sep",
  "Oct",
  "Nov",
  "Dec"
 };

/*Смотрим, какой же наш месяц по счёту*/
for(month=0; month<12; month++)
{
 if(strcmp(month_str, month_array[month])==0)
 {
  return month;
 
 }
}
/*до этого места функция не дойдёт, но надо же компилятор успокоить :)
А вдруг кто нибудь передаст в неё не название месяца, а ерунду какую нибудь :)?*/
return 99;
}

Итак, в этой теме собраны определения 3 различных времен приложения. Это:

Время компиляции,
Время исполнения,
Время модификации файла.


Автор: Гость_Наташа 15.10.2004, 00:44
спасибо Сергей!!

Автор: sergejzr 15.10.2004, 00:45
Для MFC:

Вот, нашёл smile.gif ! Чтобы забрать path пишех в любую функцию твоего приложения:

Код
char path[_MAX_PATH];
::GetModuleFileName(::AfxGetInstanceHandle(), path, _MAX_PATH);


Ну и в финале код, подрезанный для тебя. Скопируй его например в InitInstance().
Код проверен! smile.gif
Код

#include <sys/stat.h>
BOOL CDfApp::InitInstance()
{
char* date;
struct _stat    buf;
char path[_MAX_PATH];

::GetModuleFileName(::AfxGetInstanceHandle(), path, _MAX_PATH);


   /* Get data associated with this file, check if statistics are valid: */
   if(_stat(path, &buf) != 0){ return -1;}

   date=ctime(&(buf.st_mtime));
   AfxMessageBox(date);
/*Дальше продолжается твоя InitInstance.... :)*/
......
.....
...
}



ПС:
Вот полезная ссылка, не ругайся только smile.gif
http://forum.vingrad.ru/index.php?act=Reg&CODE=00
Так всем удобнее будет smile.gif
Добавлено @ 00:50
Цитата
спасибо Сергей!!


Рад был помочь smile.gif

Автор: Guest 22.10.2004, 02:55
Извините за оффтоп, но : Как получить инфу об ОС, о конфигурации компа
(в том числе версию биоса)
???
Смотрел подобное на ASM, но книжка старая, в ней номера только старых машин описаны...:(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)