FIX: CFile::SetStatus Throws Exception When Setting Time

ID: Q104638


The information in this article applies to:
  • The Microsoft Foundation Classes (MFC), included with:
    • Microsoft Visual C++, 32-bit Editions, version 1.0


SYMPTOMS

An attempt to set the status of a file using the function CFile::SetStatus results in a CFileException. If you do not have an exception handler defined, the result will depend on what the target type for the application is:

  • If it is a Win32-based application, a modal dialog box will pop up that says the command failed.


  • If running a console application, you will see output similar to:
    CFile exception: generic, OS error information = 1812 Warning: Throwing an Exception of type CFileException Error: Un-caught Exception (CFileException) AfxTerminate called AfxAbort called

    abnormal program termination



CAUSE

This behavior occurs whenever the CFileStatus member m_mtime is nonzero. There is a coding problem that incorrectly throws an exception when updating the file time.

The following console application duplicates this error:


   /* Build as a console application using
   ** Microsoft Foundation Classes
   ** Be sure that TEMP.DAT file exists in the same directory.
   */ 
   #include <afx.h>
   CFileStatus fs;
   void main(void) {
     CFile::GetStatus("TEMP.DAT",fs);
     CFile::SetStatus("TEMP.DAT",fs);
   } 


RESOLUTION

To work around this problem, update the Microsoft Foundation Class (MFC) library files by making a modification to the MFC source file FILEST.CPP. Remove the semicolon from the end of the "if" statement in line 134:

Change the following:


   if (!SystemTimeToFileTime((LPSYSTEMTIME)&sysTime, pFileTime)); 
to the following:

   if (!SystemTimeToFileTime((LPSYSTEMTIME)&sysTime, pFileTime)) 
You must then rebuild the MFC libraries. For more information on building these library files, refer to:

  • Appendix B of the online "Class Library User's Guide"


  • -or-

  • The README.TXT file in the MSVC\MFC\SRC directory


Here are two ways to build a debug and non-debug version of the MFC Library for Windows NT:

Run the NMAKE command from the \MSVCNT\MFC\SRC directory.

The debug version:

   NMAKE MODEL=N TARGET=W DEBUG=1 CODEVIEW=2 
The release version:

   NMAKE MODEL=N TARGET=W DEBUG=0 


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This bug was corrected in Microsoft Visual C++ 32-bit Edition, version 2.0.

Additional query words:

Keywords : kbFileIO kbMFC kbVC
Version : 1.0
Platform : NT WINDOWS
Issue type : kbbug


Last Reviewed: September 10, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.