如何在调用OPEN DATASET前快速检查文件是否存在(解决异常触发30秒耗时问题)
快速检查文件存在性,避免OPEN DATASET超时问题
我之前也碰到过这个糟心的问题——OPEN DATASET触发异常时的30秒超时实在太影响效率了。下面分享两个实用的方法,能在打开文件前快速判断它是否存在,帮你砍掉不必要的等待时间:
方法一:用FILE_EXISTS函数模块检查应用服务器文件
如果你的文件存储在应用服务器上,这个函数模块是最优选择,响应速度非常快,还能顺带获取文件的基础信息。它会通过file_exists参数返回布尔值,直接告诉你文件是否存在。
修改后的完整代码示例:
DATA(lv_file_exists) = abap_false. " 先检查文件是否存在 CALL FUNCTION 'FILE_EXISTS' EXPORTING filename = lv_file IMPORTING file_exists = lv_file_exists EXCEPTIONS file_not_found = 1 authorization_failure = 2 others = 3. IF lv_file_exists = abap_true. " 文件存在时再执行读写操作 TRY. OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT WITH SMART LINEFEED. CONCATENATE ` ` lv_resultdata INTO lv_resultdata. TRANSFER lv_resultdata TO lv_file. CLOSE DATASET lv_file. CATCH cx_sy_file_access_error. MESSAGE '文件存在但无法访问(可能无权限或被锁定)' TYPE 'E'. EXIT. ENDTRY. ELSE. " 文件不存在时直接提示,不用等超时 MESSAGE '文件不存在' TYPE 'E'. EXIT. ENDIF.
方法二:用CL_GUI_FRONTEND_SERVICES=>FILE_EXISTS检查本地客户端文件
如果文件是在用户本地电脑上(而非应用服务器),就用这个类方法来检查,同样能快速得到结果:
DATA(lv_file_exists) = abap_false. " 检查本地文件是否存在 CALL METHOD cl_gui_frontend_services=>file_exists EXPORTING file = lv_file RECEIVING result = lv_file_exists EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 others = 4. IF sy-subrc <> 0. MESSAGE '检查文件存在性失败' TYPE 'E'. EXIT. ENDIF. IF lv_file_exists = abap_true. TRY. OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT WITH SMART LINEFEED. CONCATENATE ` ` lv_resultdata INTO lv_resultdata. TRANSFER lv_resultdata TO lv_file. CLOSE DATASET lv_file. CATCH cx_sy_file_access_error. MESSAGE '文件存在但无法访问' TYPE 'E'. EXIT. ENDTRY. ELSE. MESSAGE '文件不存在' TYPE 'E'. EXIT. ENDIF.
注意事项
- 就算提前检查了文件存在性,也一定要保留异常捕获逻辑——毕竟可能出现文件存在但你没有读写权限、文件被其他进程锁定等情况,这些还是会触发访问错误。
- 确保当前用户有目标文件路径的读取权限,否则
FILE_EXISTS可能会返回错误的结果。
内容的提问来源于stack exchange,提问作者waxzR
相关产品推荐
相关产品推荐

