file.c
来自「一个类似windows」· C语言 代码 · 共 1,422 行 · 第 1/4 页
C
1,422 行
bytes_read = _hread( filehandle, buffer, 1);
ok( 1 == bytes_read, "file read size error\n" );
ok( buffer[0] == sillytext[0], "_llseek error, it got lost seeking\n" );
ok( HFILE_ERROR != _llseek( filehandle, 1000000, FILE_END ), "should be able to seek past file; poor, poor Windows programmers\n" );
ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
ret = DeleteFileA( filename );
ok( ret, "DeleteFile failed (%ld)\n", GetLastError( ) );
}
static void test__llopen( void )
{
HFILE filehandle;
UINT bytes_read;
char buffer[10000];
BOOL ret;
filehandle = _lcreat( filename, 0 );
if (filehandle == HFILE_ERROR)
{
ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
return;
}
ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
filehandle = _lopen( filename, OF_READ );
ok( HFILE_ERROR == _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite shouldn't be able to write!\n" );
bytes_read = _hread( filehandle, buffer, strlen( sillytext ) );
ok( strlen( sillytext ) == bytes_read, "file read size error\n" );
ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
filehandle = _lopen( filename, OF_READWRITE );
bytes_read = _hread( filehandle, buffer, 2 * strlen( sillytext ) );
ok( strlen( sillytext ) == bytes_read, "file read size error\n" );
ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite should write just fine\n" );
ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
filehandle = _lopen( filename, OF_WRITE );
ok( HFILE_ERROR == _hread( filehandle, buffer, 1 ), "you should only be able to write this file\n" );
ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite should write just fine\n" );
ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
ret = DeleteFileA( filename );
ok( ret, "DeleteFile failed (%ld)\n", GetLastError( ) );
/* TODO - add tests for the SHARE modes - use two processes to pull this one off */
}
static void test__lread( void )
{
HFILE filehandle;
char buffer[10000];
long bytes_read;
UINT bytes_wanted;
UINT i;
BOOL ret;
filehandle = _lcreat( filename, 0 );
if (filehandle == HFILE_ERROR)
{
ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
return;
}
ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
filehandle = _lopen( filename, OF_READ );
ok( HFILE_ERROR != filehandle, "couldn't open file \"%s\" again (err=%ld)\n", filename, GetLastError());
bytes_read = _lread( filehandle, buffer, 2 * strlen( sillytext ) );
ok( lstrlenA( sillytext ) == bytes_read, "file read size error\n" );
for (bytes_wanted = 0; bytes_wanted < strlen( sillytext ); bytes_wanted++)
{
ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" );
ok( _lread( filehandle, buffer, bytes_wanted ) == bytes_wanted, "erratic _hread return value\n" );
for (i = 0; i < bytes_wanted; i++)
{
ok( buffer[i] == sillytext[i], "that's not what's written\n" );
}
}
ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
ret = DeleteFileA( filename );
ok( ret, "DeleteFile failed (%ld)\n", GetLastError( ) );
}
static void test__lwrite( void )
{
HFILE filehandle;
char buffer[10000];
long bytes_read;
long bytes_written;
long blocks;
long i;
char *contents;
HLOCAL memory_object;
char checksum[1];
BOOL ret;
filehandle = _lcreat( filename, 0 );
if (filehandle == HFILE_ERROR)
{
ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
return;
}
ok( HFILE_ERROR != _lwrite( filehandle, "", 0 ), "_hwrite complains\n" );
ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
filehandle = _lopen( filename, OF_READ );
bytes_read = _hread( filehandle, buffer, 1);
ok( 0 == bytes_read, "file read size error\n" );
ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
filehandle = _lopen( filename, OF_READWRITE );
bytes_written = 0;
checksum[0] = '\0';
srand( (unsigned)time( NULL ) );
for (blocks = 0; blocks < 100; blocks++)
{
for (i = 0; i < (long)sizeof( buffer ); i++)
{
buffer[i] = rand( );
checksum[0] = checksum[0] + buffer[i];
}
ok( HFILE_ERROR != _lwrite( filehandle, buffer, sizeof( buffer ) ), "_hwrite complains\n" );
bytes_written = bytes_written + sizeof( buffer );
}
ok( HFILE_ERROR != _lwrite( filehandle, checksum, 1 ), "_hwrite complains\n" );
bytes_written++;
ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" );
memory_object = LocalAlloc( LPTR, bytes_written );
ok( 0 != memory_object, "LocalAlloc fails, could be out of memory\n" );
contents = LocalLock( memory_object );
filehandle = _lopen( filename, OF_READ );
contents = LocalLock( memory_object );
ok( NULL != contents, "LocalLock whines\n" );
ok( bytes_written == _hread( filehandle, contents, bytes_written), "read length differ from write length\n" );
checksum[0] = '\0';
i = 0;
do
{
checksum[0] += contents[i];
i++;
}
while (i < bytes_written - 1);
ok( checksum[0] == contents[i], "stored checksum differ from computed checksum\n" );
ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" );
ret = DeleteFileA( filename );
ok( ret, "DeleteFile failed (%ld)\n", GetLastError( ) );
}
static void test_CopyFileA(void)
{
char temp_path[MAX_PATH];
char source[MAX_PATH], dest[MAX_PATH];
static const char prefix[] = "pfx";
HANDLE hfile;
FILETIME ft1, ft2;
char buf[10];
DWORD ret;
BOOL retok;
ret = GetTempPathA(MAX_PATH, temp_path);
ok(ret != 0, "GetTempPathA error %ld\n", GetLastError());
ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
ret = GetTempFileNameA(temp_path, prefix, 0, source);
ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
/* make the source have not zero size */
hfile = CreateFileA(source, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0 );
ok(hfile != INVALID_HANDLE_VALUE, "failed to open source file\n");
retok = WriteFile(hfile, prefix, sizeof(prefix), &ret, NULL );
ok( retok && ret == sizeof(prefix),
"WriteFile error %ld\n", GetLastError());
ok(GetFileSize(hfile, NULL) == sizeof(prefix), "source file has wrong size\n");
/* get the file time and change it to prove the difference */
ret = GetFileTime(hfile, NULL, NULL, &ft1);
ok( ret, "GetFileTime error %ld\n", GetLastError());
ft1.dwLowDateTime -= 600000000; /* 60 second */
ret = SetFileTime(hfile, NULL, NULL, &ft1);
ok( ret, "SetFileTime error %ld\n", GetLastError());
GetFileTime(hfile, NULL, NULL, &ft1); /* get the actual time back */
CloseHandle(hfile);
ret = GetTempFileNameA(temp_path, prefix, 0, dest);
ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
SetLastError(0xdeadbeef);
ret = CopyFileA(source, dest, TRUE);
ok(!ret && GetLastError() == ERROR_FILE_EXISTS,
"CopyFileA: unexpected error %ld\n", GetLastError());
ret = CopyFileA(source, dest, FALSE);
ok(ret, "CopyFileA: error %ld\n", GetLastError());
/* make sure that destination has correct size */
hfile = CreateFileA(dest, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
ok(hfile != INVALID_HANDLE_VALUE, "failed to open destination file\n");
ret = GetFileSize(hfile, NULL);
ok(ret == sizeof(prefix), "destination file has wrong size %ld\n", ret);
/* make sure that destination has the same filetime */
ret = GetFileTime(hfile, NULL, NULL, &ft2);
ok( ret, "GetFileTime error %ld\n", GetLastError());
ok(CompareFileTime(&ft1, &ft2) == 0, "destination file has wrong filetime\n");
SetLastError(0xdeadbeef);
ret = CopyFileA(source, dest, FALSE);
ok(!ret && GetLastError() == ERROR_SHARING_VIOLATION,
"CopyFileA: ret = %ld, unexpected error %ld\n", ret, GetLastError());
/* make sure that destination still has correct size */
ret = GetFileSize(hfile, NULL);
ok(ret == sizeof(prefix), "destination file has wrong size %ld\n", ret);
retok = ReadFile(hfile, buf, sizeof(buf), &ret, NULL);
ok( retok && ret == sizeof(prefix),
"ReadFile: error %ld\n", GetLastError());
ok(!memcmp(prefix, buf, sizeof(prefix)), "buffer contents mismatch\n");
CloseHandle(hfile);
ret = DeleteFileA(source);
ok(ret, "DeleteFileA: error %ld\n", GetLastError());
ret = DeleteFileA(dest);
ok(ret, "DeleteFileA: error %ld\n", GetLastError());
}
static void test_CopyFileW(void)
{
WCHAR temp_path[MAX_PATH];
WCHAR source[MAX_PATH], dest[MAX_PATH];
static const WCHAR prefix[] = {'p','f','x',0};
DWORD ret;
ret = GetTempPathW(MAX_PATH, temp_path);
if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
return;
ok(ret != 0, "GetTempPathW error %ld\n", GetLastError());
ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
ret = GetTempFileNameW(temp_path, prefix, 0, source);
ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
ret = GetTempFileNameW(temp_path, prefix, 0, dest);
ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
ret = CopyFileW(source, dest, TRUE);
ok(!ret && GetLastError() == ERROR_FILE_EXISTS,
"CopyFileW: unexpected error %ld\n", GetLastError());
ret = CopyFileW(source, dest, FALSE);
ok(ret, "CopyFileW: error %ld\n", GetLastError());
ret = DeleteFileW(source);
ok(ret, "DeleteFileW: error %ld\n", GetLastError());
ret = DeleteFileW(dest);
ok(ret, "DeleteFileW: error %ld\n", GetLastError());
}
static void test_CreateFileA(void)
{
HANDLE hFile;
char temp_path[MAX_PATH];
char filename[MAX_PATH];
static const char prefix[] = "pfx";
DWORD ret;
ret = GetTempPathA(MAX_PATH, temp_path);
ok(ret != 0, "GetTempPathA error %ld\n", GetLastError());
ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
ret = GetTempFileNameA(temp_path, prefix, 0, filename);
ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
hFile = CreateFileA(filename, GENERIC_READ, 0, NULL,
CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0);
ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_EXISTS,
"CREATE_NEW should fail if file exists and last error value should be ERROR_FILE_EXISTS\n");
ret = DeleteFileA(filename);
ok(ret, "DeleteFileA: error %ld\n", GetLastError());
}
static void test_CreateFileW(void)
{
HANDLE hFile;
WCHAR temp_path[MAX_PATH];
WCHAR filename[MAX_PATH];
static const WCHAR emptyW[]={'\0'};
static const WCHAR prefix[] = {'p','f','x',0};
static const WCHAR bogus[] = { '\\', '\\', '.', '\\', 'B', 'O', 'G', 'U', 'S', 0 };
DWORD ret;
ret = GetTempPathW(MAX_PATH, temp_path);
if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
return;
ok(ret != 0, "GetTempPathW error %ld\n", GetLastError());
ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
ret = GetTempFileNameW(temp_path, prefix, 0, filename);
ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
hFile = CreateFileW(filename, GENERIC_READ, 0, NULL,
CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0);
ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_EXISTS,
"CREATE_NEW should fail if file exists and last error value should be ERROR_FILE_EXISTS\n");
ret = DeleteFileW(filename);
ok(ret, "DeleteFileW: error %ld\n", GetLastError());
#if 0 /* this test crashes on NT4.0 */
hFile = CreateFileW(NULL, GENERIC_READ, 0, NULL,
CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0);
ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND,
"CreateFileW(NULL) returned ret=%p error=%ld\n",hFile,GetLastError());
#endif
hFile = CreateFileW(emptyW, GENERIC_READ, 0, NULL,
CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0);
ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND,
"CreateFileW(\"\") returned ret=%p error=%ld\n",hFile,GetLastError());
/* test the result of opening a nonexistent driver name */
hFile = CreateFileW(bogus, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_NOT_FOUND,
"CreateFileW on invalid VxD name returned ret=%p error=%ld\n",hFile,GetLastError());
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?