Use DosOpen with OPEN_SHARE_DENYNONE.
/* this will copy an open program */ #define INCL_NOPM #define INCL_DOS #include <os2.h> #include <stdio.h> #include <string.h> void usage(void) { printf("USAGE: CopyOpen <source file> <dest file>\n\n"); printf(" This program, unlike the normal copy and xcopy commands,\n"); printf(" will copy an open file.\n"); printf("NOTE: Wildcards are not supported\n"); } int cdecl main(int argc, char **argv) { HFILE hf, hfOut; USHORT usAction, rc, bytesRead, bytesWriten ; static BYTE buf[4096]; long total=0l; int error = FALSE; if(argc!=3){ usage(); return 1; } rc = DosOpen(strupr(argv[1]), &hf, &usAction, 0L, FILE_NORMAL, FILE_OPEN, OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, 0L); if(rc){ printf("SYS%04u: Could not open %s for read.\n", rc, argv[1]); return 3; } rc = DosOpen(strupr(argv[2]), &hfOut, &usAction, 0L, FILE_NORMAL, FILE_CREATE | FILE_TRUNCATE, OPEN_ACCESS_WRITEONLY | OPEN_SHARE_DENYREADWRITE, 0L); if(rc){ printf("SYS%04u: Could not open %s for write.\n", rc, argv[2]); return 3; } else{ do{ rc = DosRead(hf, buf, sizeof(buf), &bytesRead); if(!rc){ rc = DosWrite(hfOut, buf, bytesRead, &bytesWriten); if(!rc) total += bytesWriten; } }while(!rc && sizeof(buf) == bytesRead && bytesRead == bytesWriten); if(rc){ printf("SYS%04u: while copying.\n", rc); error = TRUE; } if(bytesRead != bytesWriten){ printf("Disk full?\n"); error = TRUE; } DosClose(hf); if(!error) printf("%lu bytes copied.\n", total); } return( error? 3 : 0); }
Credit: Peter Fitzsimmons