#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>


static void
usage(void)
{
	printf("Usage:\n");
	printf("    rename_test.ext Open file\n");
	printf("    rename_test.ext Delete file\n");
	printf("    rename_test.ext MoveFileEx srcfile dstfile\n");
	printf("    rename_test.ext ReplaceFile srcfile dstfile\n");
	exit(0);
}

static void
OpenCommand(_TCHAR *filename)
{
	HANDLE		h = INVALID_HANDLE_VALUE;
	SECURITY_ATTRIBUTES sa;
	int			loops = 0;

	sa.nLength = sizeof(sa);
	sa.bInheritHandle = TRUE;
	sa.lpSecurityDescriptor = NULL;

	if ((h = CreateFile(filename,
	/* cannot use O_RDONLY, as it == 0 */
						   GENERIC_READ,
	/* These flags allow concurrent rename/unlink */
						   (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE),
						   &sa,
						   OPEN_EXISTING,
						   FILE_ATTRIBUTE_NORMAL,
						   NULL)) == INVALID_HANDLE_VALUE)
	{
		DWORD		err = GetLastError();
		printf("CreateFile error: %u\n", err);
		return;
	}
	printf("Opened\n");

	system("pause");

	CloseHandle(h);
	printf("Closed\n");
}

static void
MoveFileExCommand(_TCHAR *srcfilename, _TCHAR *dstfilename)
{
	if (!MoveFileEx(srcfilename, dstfilename, MOVEFILE_REPLACE_EXISTING))
	{
		DWORD		err = GetLastError();
		printf("MoveFileEx error: %u\n", err);
		return;
	}
	printf("MoveFileEx success\n");
}

static void
ReplaceFileCommand(_TCHAR *srcfilename, _TCHAR *dstfilename)
{
	if (!ReplaceFile(dstfilename, srcfilename, NULL, REPLACEFILE_IGNORE_MERGE_ERRORS, 0, 0))
	{
		DWORD		err = GetLastError();
		printf("ReplaceFile error: %u\n", err);
		return;
	}
	printf("ReplaceFile success\n");
}

static void
DeleteCommand(_TCHAR *filename)
{
	if (!DeleteFile(filename))
	{
		DWORD		err = GetLastError();
		printf("DeleteFile error: %u\n", err);
		return;
	}
	printf("DeleteFile success\n");
}

int
_tmain(int argc, _TCHAR* argv[])
{
	_TCHAR *command;

	if (argc < 2)
		usage();

	command = argv[1];

	if (_tcscmp(command, L"Open") == 0)
	{
		if (argc < 3)
			usage();
		OpenCommand(argv[2]);
	}
	else if (_tcscmp(command, L"Delete") == 0)
	{
		if (argc < 3)
			usage();
		DeleteCommand(argv[2]);
	}
	else if (_tcscmp(command, L"MoveFileEx") == 0)
	{
		if (argc < 4)
			usage();
		MoveFileExCommand(argv[2], argv[3]);
	}
	else if (_tcscmp(command, L"ReplaceFile") == 0)
	{
		if (argc < 4)
			usage();
		ReplaceFileCommand(argv[2], argv[3]);
	}
	else
	{
		usage();
	}

	return 0;
}

