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

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

ただいまの
回答率

90.84%

  • C

    3330questions

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

  • C++

    3128questions

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

  • ファイル

    156questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 551

Ineda

score 20

環境
Windows10Pro 64Bit VisualStudio2010

したいこと

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

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

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

以下ソースです。

#include <afxdisp.h>
#include <stdio.h>
#include <memory.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <direct.h>
#include <mbctype.h>
#include <mbstring.h>
#include <winspool.h>

#define MAX_COUNT        1      // ファイル最大保存数
#define FILE_SAVE_PATH "D:\\demo\\"     // 保存ディレクトリ


static char lgszFileName[10][MAX_PATH];     // 保存ディレクトリ内ファイル名バッファ

static void TryCheckFileCount(char *szpSavePath, int iMaxCount);
static int  GetPathInfo(char *szpSavePath, int iMaxCount, int *ipCount, int *ipDelIndex);
static int  CreateFile(int iNo);
//----------------------------------------------------
// ファイル削除テスト
//----------------------------------------------------
void main()
{

    int counter = 0;

    // 5秒間隔で最古ファイルの削除を行う
    while(true)
    {
        // ファイルチェック
        TryCheckFileCount(FILE_SAVE_PATH, MAX_COUNT);

        // ファイル作成
        CreateFile(counter);

        //
        Sleep(5000);

        //
        if(counter >= MAX_COUNT-1)    counter = 0;
        else                        counter++;
    }
}


// ************************************************************************
// Contents : 保存ファイル数をカウントし
//            最大件数を超えていた場合には一番古いファイルを削除する
// Argument : char szpSavePath        = 検索パス 
//       int  iMaxCount        = 最大保存件数
// ************************************************************************
static void TryCheckFileCount(char *szpSavePath, int iMaxCount) 
{


    int iSts         = 0;
    int iFileCount   = 0;
    int iDelIndex    = 0;
    char szDeleteFile[MAX_PATH] = {0};




    /*----- 保存パス情報取得 -----*/ 
    iSts = GetPathInfo(szpSavePath, iMaxCount, &iFileCount, &iDelIndex);

    /*----- ?? 失敗 -----*/ 
    if(iSts < 0)
        return;

    /*----- ?? 最大件数越えない -----*/ 
    if(iFileCount < iMaxCount)
        return;

    //puts("[ 削除処理開始 ]");

    /*----- ファイル名編集 -----*/ 
    strcat(szDeleteFile, szpSavePath);
    strcat(szDeleteFile, lgszFileName[iDelIndex]);


    /*----- 最古ファイル削除 -----*/
    printf("ファイル削除  [%s]\n", lgszFileName[iDelIndex]);
    iSts = DeleteFile(szDeleteFile);
    printf("ファイル削除Err  [%d]\n", GetLastError());


    /*----- ?? 失敗 -----*/ 
    if(iSts == 0)
        // トレース
        printf("DeleteFile失敗 File[%s] Err[%d]\n", lgszFileName[iDelIndex], GetLastError());

    return;
}



// ************************************************************************
// Contents : 最古ファイル取得
// Argument : char *szpSavePath = 保存パス
//            int *iMaxCount   = 最大保存数
//       int *ipCount     = 現在保存件数
//       int *ipDelIndex  = 削除ファイルインデックス
// ************************************************************************
static int GetPathInfo(char *szpSavePath, int iMaxCount, int *ipCount, int *ipDelIndex)
{

    HANDLE hFind;
    WIN32_FIND_DATA win32fd;
    SYSTEMTIME  st;
    ULONGLONG    timeNow;
    ULONGLONG    timeOld;        

    int  iCount             = 0;
    int  iOldFileIndex       = 0;
    char szSerchPath[MAX_PATH]  = {0};


    // 初期化
    memset(lgszFileName, 0x00, sizeof(lgszFileNameO));

    // 検索文字列作成
    strcpy(szSerchPath, szpSavePath);
    strcat(szSerchPath, "\\*");

    // ハンドル取得
    hFind = FindFirstFile(szSerchPath, &win32fd);

    // ?? 失敗
    if (hFind == INVALID_HANDLE_VALUE){
        puts("ファイル検索失敗!!"); 
        return -1;
    }

    // ファイルの場合のみ
    do 
    {
        //
        if (win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){

            // None
        } 
        else{

            // 検索ファイル名格納
            strcpy(lgszFileName[iCount], win32fd.cFileName); 

            // 今回時間(64ビット変数に変換)
            // timeNow = (((ULONGLONG)win32fd.ftLastWriteTime.dwHighDateTime) << 32) 
            //                     + win32fd.ftLastWriteTime.dwLowDateTime;

            timeNow = (((ULONGLONG)win32fd.ftCreationTime.dwHighDateTime) << 32) 
                                 + win32fd.ftCreationTime.dwLowDateTime;

            // ?? 一番最初
            if(iCount == 0)
                timeOld = timeNow;

            // ?? 古い(経過時間が小さい)
            if(timeNow < timeOld)
                // 最古ファイルインデックス取得
                iOldFileIndex = iCount;

            printf("[%s][%lld]\n", lgszFileName[iCount], timeNow);


            // ファイル総数カウント
            iCount++;
        }
    } 
    while (FindNextFile(hFind, &win32fd));

    // 
    *ipCount    = iCount;
    *ipDelIndex = iOldFileIndex;

    // ハンドルクローズ
    FindClose(hFind);

    return 0;
}


// ------------------------------------------------------------------------
// Contents : ダミーファイル作成
// Argument : ダミーNO
// Return   : 無し
// ------------------------------------------------------------------------
static int  CreateFile(int iNo)
{

    int  iFd = 0;
    char szBuff[MAX_PATH]     = {0};
    char szFileName[MAX_PATH] = {0};

    // ファイル名編集
    strcat(szBuff, FILE_SAVE_PATH);
    sprintf(szFileName, "%sDUMMY_%d",szBuff, iNo);

    printf("ファイル作成  Err[%d] [%s]\n ", GetLastError(), szFileName);

    // 新規作成
    iFd = _open(szFileName, _O_CREAT | _O_RDWR | _O_BINARY, _S_IREAD | _S_IWRITE);

    // ?? 異常
    if(iFd != -1)    
    {
        // 保存内容(4バイト)
        long num = iNo;

        // 書込
        _write(iFd, &num, sizeof(long));

        // クローズ
        _close(iFd);

        return 0;
    }
    else{

        return -1;
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/06 14:18

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

    キャンセル

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3330questions

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

  • C++

    3128questions

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

  • ファイル

    156questions

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