2025-11-28 00:35:46 +09:00
..
new
2025-11-28 00:35:46 +09:00
new
2025-11-28 00:35:46 +09:00
new
2025-11-28 00:35:46 +09:00

FCOPY    File copy implemented by memory mapped files.

Description
-----------
This program demonstrates how to use file mappings to implement a file-copy
program.  It specifcally shows you how to use the following Win32 APIs to
implement code that maps files into memory:

   CreateFile
   CreateFileMapping
   MapViewOfFile
   UnmapViewOfFile
   CloseHandle


Accessing Files Through File Mappings
-------------------------------------

In a nutshell, file mappings allow processes to create a region of virtual
memory that is backed by a specific file rather than the system pagefile.
The contents of the region can be paged in and out on demand just like any
other vitual memory, but will alway be paged in or out of the file being
mapped.  The process that created/opened the mapping uses pointers to this
region to access the file's data, just as it would use pointers to access a
block of dynamically-allocated memory.

File mappings can be used for two purposes:

   1) Accessing a file's contents as though it were memory
   2) Sharing memory between processes

This sample shows an application of purpose #1.

Why would you use file mappings to access files?  It may be easier to treat
a file's contents as memory (the Windows NT loader uses file mappings to load
executables, DLLs, and device drivers this way), or it may require less work
than conventional file I/O, which includes (to update an item in a file):

   Opening the file
   Allocating memory for the file's contents
   Seeking to the right place in the file
   Reading the file's contents into memory
   Modifying the memory
   Seeking back to where the file's contents should be written
   Writing it back out
   Closing the file
   Freeing the allocated memory

With file mappings, you can do the same with just:

   Open the file
   Create a mapping
   Map a view of the portion of the file needed
   Modify the contents through the view directly
   Unmap the view
   Close the mapping
   Close the file

Depending on how many separate places you have to update in the file, file
mappings can save a huge amount of seeking from place to place, and from
having to allocate and manage memory.


File Mapping Notes
------------------

When using file mappings to access a file's contents, be aware of the
following issues:

   1) If you create a mapping of a file that is larger than the file
      currently is, the file will be grown.  If the file cannot be grown, your
      request to create a mapping (i.e. call to CreateFileMapping) will fail.
      One reason that a file cannot be grown is if the file is read-only;
      another is that on Windows NT, you may not have permission to write to
      the file.

   2) Once a file mapping is created, it cannot be resized.  You have to
      close the mapping and create a new one.

   3) You can close a mapping before unmapping the views, or vice-versa.
      As long as there are open views, the mapping object will not be
      destroyed even if the mapping handle is closed.  This is because
      each view of a mapping refers to the mapping object, thereby keeping
      the object's reference count above zero.

   4) The corrollary to #3 is that in order to clean up a file mapping,
      you must unmap all of the views and close all handles to the file
      mapping object.  Failure to do so is a leak.


How to Build  FCOPY
-------------------

Debug build:
   nmake

Release build:
   nmake "nodebug =1"


How to Execute FCOPY
--------------------

FCOPY runs on Windows NT and Windows 95 and Windows 98.

Run FCOPY from the command line and specify a source filename followed by a
destination filename.  For example:

   c:>fcopy important.txt  backup.txt