program kopiujący pliki

0

Hej, napisałem prosty program do kopiowania plików, ale działa on jedynie wtedy gdy uruchamiam go z konsoli (jak parametr podaję plik do skopiowania). Nie działa jeżeli korzystam z metody przeciągnij i upuść w windowsie. Wtedy efektem działania programu jest:"Bląd otwarcia pliku docelowego".
Myślę że problem sprawia tutaj funkcja łącząca napisy,

strcat(h,argv[1]);

ponieważ gdy zamiast argv[1]

 podaję np. <code class="c"> "napis"

to wszystko działa jak należy (ale wiadomo że nie o to tutaj chodzi). Przypisywałem 'argv[1]' do zmiennej typu 'const char' efekt był taki sam.

Oto kod programu:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
	FILE *skad, *dokad;
	char ch;
 char h[80]="kopia_";
/*sprawdzenie liczby argumentów*/
	if(argc!=2)
	{
		printf("zla liczba argumentow");
		system("PAUSE");
		exit(1);
	}
/*ŁĄCZENIE NAPISÓW*/
		strcat(h,argv[1]); 

	/*otwieranie pliku źródłowego*/
	if((skad=fopen(argv[1],"rb"))==NULL)
	{
		printf("Blad otwarcia pliku zrodlowego\n");
		system("PAUSE");
		exit(1);
	}
	/*otwieranie docelowego*/
	if((dokad=fopen(h,"wb"))==NULL)
	{
		printf("Blad otwarcia pliku docelowego\n");
		system("PAUSE");
		exit(1);
	}
	/*kopiowanie pliku*/
	while(!feof(skad))
	{
		ch=fgetc(skad);
		if(ferror(skad))
		{
			printf("Blad odczytu pliku zrodlowego\n");
			system("PAUSE");
			exit(1);
		}
		if(!feof(skad)) fputc(ch, dokad);
		if(ferror(dokad))
		{
			printf("Blad zapisu pliku docelowego\n");
			system("PAUSE");
			exit(1);
		}
	}
      /*zamykanie plikow*/
	if(fclose(skad)==EOF)
	{
		printf("blad zamkniecia pliku zrodlowego\n");
		system("PAUSE");
		exit(1);
	}
	if(fclose(dokad)==EOF)
	{
		printf("blad zamkniecia pliku docelowego\n");
		system("PAUSE");
		exit(1);
	}
	return 0;
}
0

Kwestia uprawnień? Może otwierasz konsolę z uprawnieniami administratora (program dziedziczy te uprawnienia), a przeciągnij/upuść niekoniecznie musi te uprawnienia nadawać. Dodaj opcję "Uruchom jako administrator" do programu.

0

nic z tego :P

2

Przy przeciąganiu dostajesz pełną ścieżkę do pliku. Spróbuj ją sobie wypisać to zrozumiesz czemu nie działa.

0

Sprawdź dlaczego fopen zawodzi. Dodaj do informacji o błędzie errno. Zobaczmy dlaczego się nie otwiera, cobym nie musiał zgadywać :)

0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void err(const char* msg, const char* info)
{
  printf("%s :\t%s\n", msg, info);
  exit(-1);
}

FILE* FileOpen(const char* path, const char* mode)
{
  FILE* f = fopen(path, mode);
  if(f != NULL)
    return f;

  err("Cannot open file", path);
}

size_t GetFileSize(FILE* file)
{
  size_t result;
  fseek(file, 0, SEEK_END);
  result = ftell(file);
  rewind(file);
  return result;
}

void CopyFiles(FILE* from, FILE* to)
{
  char* buffer;
  size_t size, result;

  size = GetFileSize(from);
  buffer = (char*)malloc(sizeof(char) * size);

  if((result = fread(buffer, sizeof(char), size, from)) != size)
  {
    err("Reding error", "");
  }
  
  if((result = fwrite(buffer, sizeof(char), size, to)) != size)
  {
    err("Writing error", "");
  }

  free(buffer);
}

void GenerateCopyPath(const char* path, char* buffer)
{
  const char* add = "copy_";
  const size_t addsize = strlen(add);
  size_t size = strlen(path);
  int i;

  for(i = size; i >= 1; --i)
  {
    if(path[i - 1] == '\\')
    {
      break;
    }
  }

  memcpy(buffer, path, i);
  memcpy(buffer + i, add, addsize);
  memcpy(buffer + i + addsize, path + i, size - i);
}

int main(int argc, char *argv[])
{
  FILE *from, *to;
  char copyPath[1024] = {0};

  if(argc != 2)
  {
    err("Usage: a.exe <PATH>", "");
  }

  GenerateCopyPath(argv[1], copyPath);

  from = FileOpen(argv[1], "r");
  to = FileOpen(copyPath, "w");

  CopyFiles(from, to);
  
  fclose(from);
  fclose(to);

  return 0;
}

Jak pisal wyzej @dexiu generowanie nazwy pliku/sciezki sie sypalo w Twoim kodzie.

EDITy: usuwane smieci w kodzie ;P

1 użytkowników online, w tym zalogowanych: 0, gości: 1