質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

4450閲覧

C言語 同名ファイル作成・削除時のファイル作成・更新日時がずれる。

Ineda

総合スコア45

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

2クリップ

投稿2017/09/06 04:23

環境
Windows10Pro 64Bit VisualStudio2010

したいこと
0. ファイルを指定ディレクトリに保存
0. 同じ保存ディレクトリに同名のファイルがあった場合にファイルを削除し、新規に同名のファイルを保存する。

現象・不具合
同名のファイルを削除・保存を繰り返した場合に
削除操作を行っているにも関わらず、ファイル作成日時が削除したファイルの作成日時になる。
また、削除後、新規に作成した時間が更新日時になっている。
イメージ説明

どうしたらいいのか
「削除」→「作成」が内部的には「更新」のようになっています....。
削除処理を正常完了させるにはどのようにしたらよいのでしょうか...?
DeleteFileの代わりにremoveを用いても結果は変わりませんでした...。
ウェイト時間を削除と作成の間に10秒程入れたのですが、同様の現象が見られました。

以下ソースです。

C++

1#include <afxdisp.h> 2#include <stdio.h> 3#include <memory.h> 4#include <string.h> 5#include <io.h> 6#include <fcntl.h> 7#include <time.h> 8#include <sys/types.h> 9#include <sys/stat.h> 10#include <direct.h> 11#include <mbctype.h> 12#include <mbstring.h> 13#include <winspool.h> 14 15#define MAX_COUNT 1 // ファイル最大保存数 16#define FILE_SAVE_PATH "D:\\demo\\" // 保存ディレクトリ 17 18 19static char lgszFileName[10][MAX_PATH]; // 保存ディレクトリ内ファイル名バッファ 20 21static void TryCheckFileCount(char *szpSavePath, int iMaxCount); 22static int GetPathInfo(char *szpSavePath, int iMaxCount, int *ipCount, int *ipDelIndex); 23static int CreateFile(int iNo); 24//---------------------------------------------------- 25// ファイル削除テスト 26//---------------------------------------------------- 27void main() 28{ 29 30 int counter = 0; 31 32 // 5秒間隔で最古ファイルの削除を行う 33 while(true) 34 { 35 // ファイルチェック 36 TryCheckFileCount(FILE_SAVE_PATH, MAX_COUNT); 37 38 // ファイル作成 39 CreateFile(counter); 40 41 // 42 Sleep(5000); 43 44 // 45 if(counter >= MAX_COUNT-1) counter = 0; 46 else counter++; 47 } 48} 49 50 51// ************************************************************************ 52// Contents : 保存ファイル数をカウントし 53// 最大件数を超えていた場合には一番古いファイルを削除する 54// Argument : char szpSavePath = 検索パス 55// int iMaxCount = 最大保存件数 56// ************************************************************************ 57static void TryCheckFileCount(char *szpSavePath, int iMaxCount) 58{ 59 60 61 int iSts = 0; 62 int iFileCount = 0; 63 int iDelIndex = 0; 64 char szDeleteFile[MAX_PATH] = {0}; 65 66 67 68 69 /*----- 保存パス情報取得 -----*/ 70 iSts = GetPathInfo(szpSavePath, iMaxCount, &iFileCount, &iDelIndex); 71 72 /*----- ?? 失敗 -----*/ 73 if(iSts < 0) 74 return; 75 76 /*----- ?? 最大件数越えない -----*/ 77 if(iFileCount < iMaxCount) 78 return; 79 80 //puts("[ 削除処理開始 ]"); 81 82 /*----- ファイル名編集 -----*/ 83 strcat(szDeleteFile, szpSavePath); 84 strcat(szDeleteFile, lgszFileName[iDelIndex]); 85 86 87 /*----- 最古ファイル削除 -----*/ 88 printf("ファイル削除 [%s]\n", lgszFileName[iDelIndex]); 89 iSts = DeleteFile(szDeleteFile); 90 printf("ファイル削除Err [%d]\n", GetLastError()); 91 92 93 /*----- ?? 失敗 -----*/ 94 if(iSts == 0) 95 // トレース 96 printf("DeleteFile失敗 File[%s] Err[%d]\n", lgszFileName[iDelIndex], GetLastError()); 97 98 return; 99} 100 101 102 103// ************************************************************************ 104// Contents : 最古ファイル取得 105// Argument : char *szpSavePath = 保存パス 106// int *iMaxCount = 最大保存数 107// int *ipCount = 現在保存件数 108// int *ipDelIndex = 削除ファイルインデックス 109// ************************************************************************ 110static int GetPathInfo(char *szpSavePath, int iMaxCount, int *ipCount, int *ipDelIndex) 111{ 112 113 HANDLE hFind; 114 WIN32_FIND_DATA win32fd; 115 SYSTEMTIME st; 116 ULONGLONG timeNow; 117 ULONGLONG timeOld; 118 119 int iCount = 0; 120 int iOldFileIndex = 0; 121 char szSerchPath[MAX_PATH] = {0}; 122 123 124 // 初期化 125 memset(lgszFileName, 0x00, sizeof(lgszFileNameO)); 126 127 // 検索文字列作成 128 strcpy(szSerchPath, szpSavePath); 129 strcat(szSerchPath, "\\*"); 130 131 // ハンドル取得 132 hFind = FindFirstFile(szSerchPath, &win32fd); 133 134 // ?? 失敗 135 if (hFind == INVALID_HANDLE_VALUE){ 136 puts("ファイル検索失敗!!"); 137 return -1; 138 } 139 140 // ファイルの場合のみ 141 do 142 { 143 // 144 if (win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){ 145 146 // None 147 } 148 else{ 149 150 // 検索ファイル名格納 151 strcpy(lgszFileName[iCount], win32fd.cFileName); 152 153 // 今回時間(64ビット変数に変換) 154 // timeNow = (((ULONGLONG)win32fd.ftLastWriteTime.dwHighDateTime) << 32) 155 // + win32fd.ftLastWriteTime.dwLowDateTime; 156 157 timeNow = (((ULONGLONG)win32fd.ftCreationTime.dwHighDateTime) << 32) 158 + win32fd.ftCreationTime.dwLowDateTime; 159 160 // ?? 一番最初 161 if(iCount == 0) 162 timeOld = timeNow; 163 164 // ?? 古い(経過時間が小さい) 165 if(timeNow < timeOld) 166 // 最古ファイルインデックス取得 167 iOldFileIndex = iCount; 168 169 printf("[%s][%lld]\n", lgszFileName[iCount], timeNow); 170 171 172 // ファイル総数カウント 173 iCount++; 174 } 175 } 176 while (FindNextFile(hFind, &win32fd)); 177 178 // 179 *ipCount = iCount; 180 *ipDelIndex = iOldFileIndex; 181 182 // ハンドルクローズ 183 FindClose(hFind); 184 185 return 0; 186} 187 188 189// ------------------------------------------------------------------------ 190// Contents : ダミーファイル作成 191// Argument : ダミーNO 192// Return : 無し 193// ------------------------------------------------------------------------ 194static int CreateFile(int iNo) 195{ 196 197 int iFd = 0; 198 char szBuff[MAX_PATH] = {0}; 199 char szFileName[MAX_PATH] = {0}; 200 201 // ファイル名編集 202 strcat(szBuff, FILE_SAVE_PATH); 203 sprintf(szFileName, "%sDUMMY_%d",szBuff, iNo); 204 205 printf("ファイル作成 Err[%d] [%s]\n ", GetLastError(), szFileName); 206 207 // 新規作成 208 iFd = _open(szFileName, _O_CREAT | _O_RDWR | _O_BINARY, _S_IREAD | _S_IWRITE); 209 210 // ?? 異常 211 if(iFd != -1) 212 { 213 // 保存内容(4バイト) 214 long num = iNo; 215 216 // 書込 217 _write(iFd, &num, sizeof(long)); 218 219 // クローズ 220 _close(iFd); 221 222 return 0; 223 } 224 else{ 225 226 return -1; 227 } 228}
Chironian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

投稿2017/09/06 04:43

HiroshiWatanabe

総合スコア2160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ineda

2017/09/06 05:18

それです!! ありがとうございました(^^)/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問