C编程 - 从特定的Windows目录打开

时间:2014-10-06 06:16:21

标签: c fopen

我是C编程语言的新手。我正在编写一个程序,最终将从用户输入的目录中读取mp3文件,并利用id3中的元数据将mp3分类为艺术家/专辑文件夹。我使用system()函数调用访问用户的目录,并生成包含该目录中所有mp3的.txt文件。但是,当我尝试访问第一个mp3文件时,我遇到了问题。我正在构建mp3文件的路径,但该文件无法打开。当我对路径进行硬编码时,文件会打开。

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

struct FILE_head
{
  char file_id[3];
  char version[2];
  char flags;
  char size[4];
};

int main()
{
  //declare vars
  char cd[1200];
  char mp3[200];
  char dir[1000];
  char mp3_path[1200];
  FILE *list_file;
  FILE *mp3_file;
  struct FILE_head id3;
  char dir_cmd[1300] = "dir ";
  char find_cmd[100] = "/b | find \".mp3\" > \"mp3List.txt\"";
  int dir_len;
  int amt_read;

  //main code

  while(1)
  {
    cd[0]='c'; 
    cd[1]='d';
    cd[2]=' ';
    cd[3]='\0';

    printf("Enter the directory where mp3's are located:");
    scanf("%s", dir);
    strcat(cd, dir);
    if(system(cd) == 0) //if directory is valid, break.  otherwise stay in loop/reprompt
        break;
    printf("Valid directory Ex--> c:\\users\\username\\music\n");
  }

  //build cmd statement
  strcat(dir_cmd, dir);
  strcat(dir_cmd, find_cmd);
  system(dir_cmd);

  dir_len = strlen(dir);
  strcpy(mp3_path, dir);
  printf("%s\n", mp3_path);

  list_file = fopen("mp3List.txt", "rb");
  if(list_file != NULL)
  {
    while(fgets(mp3, sizeof(mp3), list_file))
    {
      printf("%s", mp3);
      strcat(mp3_path, mp3);
      printf("%s\n", mp3_path);
      mp3_path[strlen(mp3_path)-1] = '\0';
      mp3_file = fopen(mp3_path, "rb");
      if(mp3_file != NULL)
      {
        printf("in this loop");
        fread(&id3, sizeof(id3), 1, mp3_file);
        printf("%s\n", id3.file_id);
      }
    }
  }
  return 0;
}

这是我第一次发帖,所以如果有更多信息有用,请告诉我。我意识到可能会有更好的&#34;访问目录的方法,但我不想使用任何不在 C 标准库中的函数。

这是我的输出:

  

C:\ Users \ Mitchell \ Projects&gt; mp3sort.exe进入mp3&#39; s的目录   位于:c:\ users \ mitchell \ projects \ music_test \   c:\ users \ mitchell \ projects \ music_test \ 01 - Time to Pretend.mp3   c:\ users \ mitchell \ projects \ music_test \ 01 - Time to Pretend.mp3

     

01-all_that_remains-this_calling.mp3   01-all_that_remains-this_calling.mp3t \ 01 - Time to Pretend.mp3

     

07比利乔尔 - 每个人都爱你.mp3 07比利乔尔 - 每个人   爱你Now.mp3Time to Pretend.mp3

     

为Sheep.mp3dy爱你的Sheep.mp3眼泪的泪水   Now.mp3Time到Pretend.mp3

     

C:\用户\米切尔\项目与GT;

我知道我在第一个文件之后的所有文件的当前版本都不正确,但我只是专注于让第一个mp3_path工作。我删除了换行符:mp3_path[strlen(mp3_path)-1] = '\0';

1 个答案:

答案 0 :(得分:2)

system()在子进程中执行提供的命令。执行system ("cd somedir")时,{child}会在子进程中执行,因此您的进程的工作目录保持不变。

如果您想更改流程工作目录,请使用chdir()(或_chdir(),或SetCurrentDirectory(如果您要使用Windows API)功能。

或者,您可以通过将目录添加到文件名来避免更改工作目录。