ここでは、以下の処理をするプログラムを説明します。
保管フォルダ内の帳票一覧を取得します。
取得した帳票名が「2000年度」で前方一致するかを比較します。
前方一致した場合、その帳票を削除します。
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
#include "lvsvapi.h"
typedef LWAPIHANDLE (*LPSTARTSVAPIEX)(lw_charcode_t);
typedef void (*LPENDSVAPI)(LWAPIHANDLE);
typedef int (*LPGETSERVERERRCODE)(LWAPIHANDLE);
typedef void (*LPGETSERVERERRMSG)(LWAPIHANDLE, char*);
typedef LWFOLDERHANDLE (*LPSTARTKEEPFOLDER)(LWAPIHANDLE, char*, int);
typedef int (*LPENDKEEPFOLDER)(LWAPIHANDLE, LWFOLDERHANDLE);
typedef int (*LPGETKEEPFOLDERCOUNT)(LWAPIHANDLE, LWFOLDERHANDLE, int*);
typedef int (*LPGETKEEPFOLDERITEM)(LWAPIHANDLE, LWFOLDERHANDLE, int, LPKPFINFO);
typedef LWLISTHANDLE (*LPSTARTKEEPLIST)(LWAPIHANDLE, char*);
typedef int (*LPENDKEEPLIST)(LWAPIHANDLE, LWLISTHANDLE);
typedef int (*LPGETKEEPLISTCOUNT)(LWAPIHANDLE, LWLISTHANDLE, int*);
typedef int (*LPGETKEEPLISTITEM)(LWAPIHANDLE, LWLISTHANDLE, int, LPKPLINFO);
typedef int (*LPDELETEKEEPFILE)(LWAPIHANDLE, char*);
/******************************************************************************/
/* 1.機能概要 */
/* 1)保管フォルダの一覧を取得する。 */
/* 2)保管フォルダ内の帳票一覧を取得する。 */
/* 3)取得した帳票名が、「2000年度」で前方一致するか比較する。 */
/* 比較した結果、前方一致したら、その帳票を削除する。 */
/******************************************************************************/
int main(int iArgc, char* cArgv[])
{
void *hinSvAPi = NULL;
int iRetCode = 0; /* 関数復帰値 */
LWAPIHANDLE iLwSvApiH = 0; /* サーバAPI ハンドル */
LWFOLDERHANDLE iLwSvKpFH = 0; /* 保管フォルダ一覧ハンドル */
LWLISTHANDLE iLwSvKpLH = 0; /* 保管フォルダ帳票一覧ハンドル */
lw_charcode_t encode = LW_UTF8; /* 入出力の文字列コード */
int iKpFCount = 0; /* 保管フォルダ数 */
KPFINFO KpFInfo; /* 保管フォルダ情報構造体 */
LPKPFINFO lpKpFInfo = &KpFInfo;
KPLINFO KpLInfo; /* 帳票一覧情報構造体 */
LPKPLINFO lpKpLInfo = &KpLInfo;
int iKpLCount = 0; /* 帳票一覧数 */
int ie_ErrCode = 0; /* エラーコード */
char ce_ErrMsg[1024]; /* エラーメッセージ格納域 */
int iKpFIndex = 0; /* フォルダカウンタ */
int iKpLIndex = 0; /* 帳票カウンタ */
int iFindFlg = 0; /* フラグ */
char ceDeleteFile[260+4]; /* 削除対象ファイル */
/**************************************************************************/
/* サーバAPI 関数宣言 */
/**************************************************************************/
LWAPIHANDLE (*fp_StartSvApiEx)(lw_charcode_t);
void (*fp_EndSvApi)(LWAPIHANDLE);
int (*fp_GetServerApiErrCode)(LWAPIHANDLE);
void (*fp_GetServerApiErrMsg)(LWAPIHANDLE, char*);
LWFOLDERHANDLE (*fp_StartKeepFolder)(LWAPIHANDLE, char*, int);
int (*fp_EndKeepFolder)(LWAPIHANDLE, LWFOLDERHANDLE);
int (*fp_GetKeepFolderCount)(LWAPIHANDLE, LWFOLDERHANDLE, int*);
int (*fp_GetKeepFolderItem)(LWAPIHANDLE, LWFOLDERHANDLE, int, LPKPFINFO);
LWLISTHANDLE (*fp_StartKeepList)(LWAPIHANDLE, char*);
int (*fp_EndKeepList)(LWAPIHANDLE, LWLISTHANDLE);
int (*fp_GetKeepListCount)(LWAPIHANDLE, LWLISTHANDLE, int*);
int (*fp_GetKeepListItem)(LWAPIHANDLE, LWLISTHANDLE, int, LPKPLINFO);
int (*fp_DeleteKeepFile)(LWAPIHANDLE, char*);
/**************************************************************************/
/* 初期化処理 */
/**************************************************************************/
memset(ceDeleteFile, 0, 260+4);
/**************************************************************************/
/* サーバAPI ライブラリ(liblwapi.so)のロード */
/**************************************************************************/
hinSvAPi = dlopen("/opt/FJSVlw-sv/lib/liblwapi.so", RTLD_LAZY);
if(hinSvAPi == NULL)
{
printf("ライブラリliblwapi.so のロードに失敗しました。\n");
goto EXIT;
}
/**************************************************************************/
/* 関数アドレスを取得 */
/**************************************************************************/
fp_StartSvApiEx = (LPSTARTSVAPIEX)dlsym(hinSvAPi, "LW_StartServerApiEx");
if(fp_StartSvApiEx == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
fp_EndSvApi = (LPENDSVAPI)dlsym(hinSvAPi, "LW_EndServerApi");
if(fp_EndSvApi == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
fp_GetServerApiErrCode
= (LPGETSERVERERRCODE)dlsym(hinSvAPi, "LW_GetServerApiErrCode");
if(fp_GetServerApiErrCode == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
fp_GetServerApiErrMsg
= (LPGETSERVERERRMSG)dlsym(hinSvAPi, "LW_GetServerApiErrMsg");
if(fp_GetServerApiErrMsg == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
fp_StartKeepFolder
= (LPSTARTKEEPFOLDER)dlsym(hinSvAPi, "LW_StartKeepFolder");
if(fp_StartKeepFolder == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
fp_EndKeepFolder = (LPENDKEEPFOLDER)dlsym(hinSvAPi, "LW_EndKeepFolder");
if(fp_EndKeepFolder == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
fp_GetKeepFolderCount
= (LPGETKEEPFOLDERCOUNT)dlsym(hinSvAPi, "LW_GetKeepFolderCount");
if(fp_GetKeepFolderCount == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
fp_GetKeepFolderItem
= (LPGETKEEPFOLDERITEM)dlsym(hinSvAPi, "LW_GetKeepFolderItem");
if(fp_GetKeepFolderItem == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
fp_StartKeepList = (LPSTARTKEEPLIST)dlsym(hinSvAPi, "LW_StartKeepList");
if(fp_StartKeepList == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
fp_EndKeepList = (LPENDKEEPLIST)dlsym(hinSvAPi, "LW_EndKeepList");
if(fp_EndKeepList == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
fp_GetKeepListCount
= (LPGETKEEPLISTCOUNT)dlsym(hinSvAPi, "LW_GetKeepListCount");
if(fp_GetKeepListCount == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
fp_GetKeepListItem
= (LPGETKEEPLISTITEM)dlsym(hinSvAPi, "LW_GetKeepListItem");
if(fp_GetKeepListItem == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
fp_DeleteKeepFile = (LPDELETEKEEPFILE)dlsym(hinSvAPi, "LW_DeleteKeepFile");
if(fp_DeleteKeepFile == NULL)
{
printf("関数アドレスの取得に失敗しました。\n");
goto EXIT;
}
/**************************************************************************/
/* サーバAPI 開始 */
/**************************************************************************/
iLwSvApiH = (*fp_StartSvApiEx)(encode);
if(iLwSvApiH == 0)
{
printf("サーバAPI の開始(LW_StartServerApiEx)に失敗しました。\n");
goto EXIT;
}
/**************************************************************************/
/* 保管フォルダ一覧開始 */
/**************************************************************************/
iLwSvKpFH = (*fp_StartKeepFolder)(iLwSvApiH, NULL, 0);
if(iLwSvKpFH == 0)
{
(*fp_GetServerApiErrMsg)(iLwSvApiH, ce_ErrMsg);
ie_ErrCode = (*fp_GetServerApiErrCode)(iLwSvApiH);
printf("%s RC=%d", ce_ErrMsg, ie_ErrCode);
goto EXIT;
}
/**************************************************************************/
/* 保管フォルダ数取得 */
/**************************************************************************/
iRetCode = (*fp_GetKeepFolderCount)(iLwSvApiH, iLwSvKpFH, &iKpFCount);
if(iRetCode != 0)
{
(*fp_GetServerApiErrMsg)(iLwSvApiH, ce_ErrMsg);
ie_ErrCode = (*fp_GetServerApiErrCode)(iLwSvApiH);
printf("%s RC=%d", ce_ErrMsg, ie_ErrCode);
goto EXIT;
}
/**************************************************************************/
/* 保管フォルダ数分ループする */
/**************************************************************************/
for(iKpFIndex = 0; iKpFIndex < iKpFCount; iKpFIndex ++)
{
/**********************************************************************/
/* 保管フォルダ一覧情報を取得 */
/**********************************************************************/
memset(lpKpFInfo, 0, sizeof(KPFINFO)); /* 初期化処理 */
lpKpFInfo->usf_Length = sizeof(KPFINFO); /* 構造体サイズ */
iRetCode
= (*fp_GetKeepFolderItem)(iLwSvApiH, iLwSvKpFH, iKpFIndex, lpKpFInfo);
if(iRetCode != 0)
{
(*fp_GetServerApiErrMsg)(iLwSvApiH, ce_ErrMsg);
ie_ErrCode = (*fp_GetServerApiErrCode)(iLwSvApiH);
printf("%s RC=%d", ce_ErrMsg, ie_ErrCode);
goto EXIT;
}
/**********************************************************************/
/* 保管フォルダ内の帳票一覧開始 */
/**********************************************************************/
iLwSvKpLH = (*fp_StartKeepList)(iLwSvApiH, lpKpFInfo->cf_PathName);
if(iLwSvKpLH == 0)
{
(*fp_GetServerApiErrMsg)(iLwSvApiH, ce_ErrMsg);
ie_ErrCode = (*fp_GetServerApiErrCode)(iLwSvApiH);
printf("%s RC=%d", ce_ErrMsg, ie_ErrCode);
continue;
}
/**********************************************************************/
/* 保管フォルダ内の帳票数取得 */
/**********************************************************************/
iRetCode = (*fp_GetKeepListCount)(iLwSvApiH, iLwSvKpLH, &iKpLCount);
if(iRetCode != 0)
{
(*fp_GetServerApiErrMsg)(iLwSvApiH, ce_ErrMsg);
ie_ErrCode = (*fp_GetServerApiErrCode)(iLwSvApiH);
printf("%s RC=%d", ce_ErrMsg, ie_ErrCode);
goto EXIT;
}
/**********************************************************************/
/* 保管フォルダ内の帳票一覧数分ループする */
/**********************************************************************/
for(iKpLIndex = 0; iKpLIndex < iKpLCount; iKpLIndex ++)
{
/******************************************************************/
/* 保管フォルダ内の帳票一覧情報の取得 */
/******************************************************************/
memset(lpKpLInfo, 0, sizeof(KPLINFO)); /* 初期化処理 */
lpKpLInfo->usl_Length = sizeof(KPLINFO); /* 構造体の長さ */
iRetCode = (*fp_GetKeepListItem)(iLwSvApiH, iLwSvKpLH, iKpLIndex,
lpKpLInfo);
if(iRetCode != 0)
{
(*fp_GetServerApiErrMsg)(iLwSvApiH, ce_ErrMsg);
ie_ErrCode = (*fp_GetServerApiErrCode)(iLwSvApiH);
printf("%s RC=%d", ce_ErrMsg, ie_ErrCode);
break;
}
/* 取得した帳票名が、"2000年度"か比較する */
iRetCode = memcmp(lpKpLInfo->cl_Title, "2000年度", 8);
if (iRetCode == 0)
{
/* 帳票のフルパス名を取得する */
iFindFlg = 1;
strcpy(ceDeleteFile, lpKpLInfo->cl_SplFile);
break;
}
}
/**********************************************************************/
/* 保管フォルダ内の帳票一覧終了 */
/**********************************************************************/
if(iLwSvKpLH != 0)
{
(*fp_EndKeepList)(iLwSvApiH, iLwSvKpLH);
iLwSvKpLH = 0;
}
/* 該当する帳票が見つかったため、ループ処理を抜ける */
if (iFindFlg == 1)
break;
}
/**************************************************************************/
/* 保管フォルダ終了 */
/**************************************************************************/
if(iLwSvKpFH != 0)
{
(*fp_EndKeepFolder)(iLwSvApiH, iLwSvKpFH);
iLwSvKpFH = 0;
}
/**************************************************************************/
/* 保管フォルダ内の帳票の削除(フルパス指定) */
/**************************************************************************/
if (iFindFlg == 1)
{
iRetCode = (*fp_DeleteKeepFile)(iLwSvApiH, ceDeleteFile);
if(iRetCode != 0)
{
(*fp_GetServerApiErrMsg)(iLwSvApiH, ce_ErrMsg);
ie_ErrCode = (*fp_GetServerApiErrCode)(iLwSvApiH);
printf("%s RC=%d", ce_ErrMsg, ie_ErrCode);
goto EXIT;
}
}
/******************************************************************************/
/* 終了処理 */
/******************************************************************************/
EXIT:
if(iLwSvKpLH != 0)
(*fp_EndKeepList)(iLwSvApiH, iLwSvKpLH);
if(iLwSvKpFH != 0)
(*fp_EndKeepFolder)(iLwSvApiH, iLwSvKpFH);
if(iLwSvApiH != 0)
(*fp_EndSvApi)(iLwSvApiH);
dlclose(hinSvAPi);
return 0;
}