struct stat
{
dev_t st_dev; /* device */
ino_t st_ino; /* inode */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device type (if inode device) */
off_t st_size; /* total size, in bytes */
unsigned long st_blksize; /* blocksize for filesystem I/O */
unsigned long st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
};
MS Windows API에는 GetFileTime(), GetFileInformationByHandle() 등이 있어서 CreateTime을 가져 올 수 있군요.
BOOL GetFileTime(
HANDLE hFile, // handle to file
LPFILETIME lpCreationTime, // creation time
LPFILETIME lpLastAccessTime, // last access time
LPFILETIME lpLastWriteTime // last write time
);
typedef struct _BY_HANDLE_FILE_INFORMATION {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD dwVolumeSerialNumber;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD nNumberOfLinks;
DWORD nFileIndexHigh;
DWORD nFileIndexLow;
} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION;
재밌는게, stat와 MSWindows API 모두 각각 세개의 시각을 가지고 있으나, 그 용도가 조금 차이가 나네요.
혹시 CrossPlatform인 Kylix는 어떻게 처리하나 봤더니,
function AllocFileInfo(SearchRec: TSearchRec): PFileInfo;
{$IFDEF LINUX}
var
statbuf: TStatBuf;
FName: string;
Ret: Integer;
Buffer: array[0.._POSIX_PATH_MAX - 1] of Char;
{$ENDIF}
begin
New(Result);
FillChar(Result^, SizeOf(Result^), 0);
Result^.SR := SearchRec;
{$IFDEF LINUX}
FName := SearchRec.PathOnly + SearchRec.Name;
if stat(PChar(FName), statbuf) = 0 then
Result^.stat := statbuf;
if SearchRec.Attr and faSymLink <> 0 then
begin
Ret := readlink(PChar(FName), Buffer, SizeOf(Buffer));
if Ret > 0 then
begin
SetString(Result^.LinkTarget, Buffer, Ret);
if IsRelativePath(Result^.LinkTarget) then
Result^.LinkTarget := SearchRec.PathOnly + Result^.LinkTarget;
Result^.LinkTarget := ExpandFileName(Result^.LinkTarget);
end;
end;
{$ENDIF}
Result^.ImageIndex := iiNoIcon;
end;
위의 코드는 delphi7에서 가져온 겁니다만, Kylix호환코드니 kylix와 크게 다르지 않을 것 같네요.
어쨋든, 현재로는 stat로는 화일의 생성 시각을 알 수 없는 건 거의 확실하구요,
다른 함수가 있으면 모르겠지만, FileSystem자체에 화일 생성 시각에 관한 정보를 가지고 있는 지 조차 의문스럽습니다.... (여기저기 찾아봐도 없는 것 같은 기분이 듭니다...)
유닉스 시간에서 st_ctime을 쓰시면 대략 유사할 겁니다. ctime은 해당 파일 inode의 마지막 변경 시간을 의미하는데, 이런 일은 파일 생성/위치 변경 등의 경우밖에 없습니다. 파일 내용에 대한 읽기/쓰기는 ctime을 바꾸지 않습니다.
정확히 파일이 생긴 시간은 아니기는 하네요.
st_ctime Time when file status was last changed (inode data modifi-cation). Changed by the chflags(2), chmod(2), chown(2), creat(2), link(2), mkdir(2), mkfifo(2), mknod(2), rename(2), rmdir(2), symlink(2), truncate(2), unlink(2), utimes(2), write(2) and writev(2) system calls.
ctime은 화일의 생성/위치 변경 뿐만 아니라, inode에 대한 자체의 정보-예를 들어 owner, permission등-이 변경될 때도 reset됩니다.
cjh wrote:
유닉스 시간에서 st_ctime을 쓰시면 대략 유사할 겁니다. ctime은 해당 파일 inode의 마지막 변경 시간을 의미하는데, 이런 일은 파일 생성/위치 변경 등의 경우밖에 없습니다. 파일 내용에 대한 읽기/쓰기는 ctime을 바꾸지 않습니다.
정확히 파일이 생긴 시간은 아니기는 하네요.
st_ctime Time when file status was last changed (inode data modifi-cation). Changed by the chflags(2), chmod(2), chown(2), creat(2), link(2), mkdir(2), mkfifo(2), mknod(2), rename(2), rmdir(2), symlink(2), truncate(2), unlink(2), utimes(2), write(2) and writev(2) system calls.
없는 걸로 알고 있습니다.ls 명령에도 파일을 처음 만든 시간은
없는 걸로 알고 있습니다.
ls 명령에도 파일을 처음 만든 시간은 안 나오고 최종 수정한 시간만 나오고,
엠에스윈도 탐색기에도 최종 수정한 시간만 나오던데요?
세벌 https://sebuls.blogspot.kr/
있을꺼 같긴합니다만...
저도 잘모르겠습니다만..
어딘가 있을듯
Always
stat로는 알 수 없는 게 확실한 것 같구요...[code:1]
stat로는 알 수 없는 게 확실한 것 같구요...
MS Windows API에는 GetFileTime(), GetFileInformationByHandle() 등이 있어서 CreateTime을 가져 올 수 있군요.
재밌는게, stat와 MSWindows API 모두 각각 세개의 시각을 가지고 있으나, 그 용도가 조금 차이가 나네요.
혹시 CrossPlatform인 Kylix는 어떻게 처리하나 봤더니,
위의 코드는 delphi7에서 가져온 겁니다만, Kylix호환코드니 kylix와 크게 다르지 않을 것 같네요.
어쨋든, 현재로는 stat로는 화일의 생성 시각을 알 수 없는 건 거의 확실하구요,
다른 함수가 있으면 모르겠지만, FileSystem자체에 화일 생성 시각에 관한 정보를 가지고 있는 지 조차 의문스럽습니다.... (여기저기 찾아봐도 없는 것 같은 기분이 듭니다...)
어쨋든.... 찾아보느라 많이 배웠네요..
그리고, 짚고 넘어가야 할 것 한가지
생성 시간 이 아니라 생성 시각입니다.
유닉스 시간에서 st_ctime을 쓰시면 대략 유사할 겁니다. ctime
유닉스 시간에서 st_ctime을 쓰시면 대략 유사할 겁니다. ctime은 해당 파일 inode의 마지막 변경 시간을 의미하는데, 이런 일은 파일 생성/위치 변경 등의 경우밖에 없습니다. 파일 내용에 대한 읽기/쓰기는 ctime을 바꾸지 않습니다.
정확히 파일이 생긴 시간은 아니기는 하네요.
st_ctime Time when file status was last changed (inode data modifi-cation). Changed by the chflags(2), chmod(2), chown(2), creat(2), link(2), mkdir(2), mkfifo(2), mknod(2), rename(2), rmdir(2), symlink(2), truncate(2), unlink(2), utimes(2), write(2) and writev(2) system calls.
--
익스펙토 페트로눔
음. FreeBSD stat(2)에는 st_birthtime이라는게 있네
음. FreeBSD stat(2)에는 st_birthtime이라는게 있네요. inode의 생성 시간이라고 합니다.
st_birthtime Time when the inode was created.
http://www.freebsd.org/cgi/man.cgi?query=stat&apropos=0&sektion=2&manpath=FreeBSD+5.2-RELEASE+and+Ports&format=html
--
익스펙토 페트로눔
ctime은 화일의 생성/위치 변경 뿐만 아니라, inode에 대한 자체
ctime은 화일의 생성/위치 변경 뿐만 아니라, inode에 대한 자체의 정보-예를 들어 owner, permission등-이 변경될 때도 reset됩니다.
그리고, 한번 더 - 시각입니다.
흠... 그러네요.FreeBSD에만 있네요.그리고, 그것도 처음부
흠... 그러네요.
FreeBSD에만 있네요.
그리고, 그것도 처음부터 있던 건 아니었고, 5.x대 릴리즈부터 들어있군요.
특이한 건, 그 이전에 잠시 들어가 있던 이름은 st_createtime이었네요.
댓글 달기