Hi
I am using the ShellExecute to copy/rename files. I run into a very strange problem: If I use it to rename file A to file B, then I cannot open file B immediately, fOpen() fails! I need to wait a little, like Threadsleep(1000).
Here is the code to test it:
global
Title,
fhRead,
fhWrite,
selected_folder,
FileRead,
FileWrite;
// source_name must contain the path too.
// target_name does not contain the path.
// Handles spaces in filenames and dirnames
// example call:
// selected_folder = "C:\\some dir\\";
// rename_file(selected_folder + "my file.txt", "bbb123.txt");
procedure rename_file( source_name, target_name )
{
local
x,
str;
source_name = "\"" + source_name + "\"";
target_name = "\"" + target_name + "\"";
str = "/c rename " + source_name + " " + target_name;
x = ShellExecute( "cmd", str, "" );
if( x <= 32 )
printf( "RENAME-ShellExecute failed, error code = %g \n", x );
}
// source_name must contain the path too.
// target_name must contain the path too.
// Handles spaces in filenames and dirnames
// example call:
// selected_folder = "C:\\some dir\\";
// copy_file(selected_folder + "my file.txt", selected_folder + "bbb123.txt");
procedure copy_file( source_name, target_name )
{
local
x,
str;
source_name = "\"" + source_name + "\"";
target_name = "\"" + target_name + "\"";
str = "/c copy " + source_name + " " + target_name;
x = ShellExecute( "cmd", str, "" );
if( x <= 32 )
printf( "COPY-ShellExecute failed, error code = %g \n", x );
}
EnableTextOutput( 0 );
selected_folder = "C:\\test-call-stack\\";
FileRead = "kalimera.afl";
FileWrite = "kalimera.txt" ;
Title = "ATTENTION: make sure that FileWrite does NOT exist, or experiment will fail";
if( ParamTrigger( "Run Fast (with Error!)", "OK" ) )
{
rename_file( selected_folder + FileRead, FileWrite );
fhWrite = fopen( selected_folder + FileWrite, "r", true ); // open file for Read
if( NOT fhWrite )
{
printf( "Error opening " + selected_folder + FileWrite + "\n" );
_TRACE( "Error opening " + selected_folder + FileWrite );
}
else
fclose( fhWrite );
}
if( ParamTrigger( "Run Slow", "OK" ) )
{
rename_file( selected_folder + FileRead, FileWrite );
ThreadSleep( 1000 );
fhWrite = fopen( selected_folder + FileWrite, "r", true ); // open file for Read
if( NOT fhWrite )
{
printf( "Error opening " + selected_folder + FileWrite + "\n" );
_TRACE( "Error opening " + selected_folder + FileWrite );
}
else
fclose( fhWrite );
}
Please make sure you have the proper directory "C:\test-call-stack\", and a small file inside it: kalimera.afl.