开源改变世界

尝试打印“/a/b/job.g”时,文件夹 b 无法打开。 #865

推推 grbl 3年前 (2023-02-06) 203次浏览
关闭
pizero 打开了这个问题 2014 年 4 月 1 日 · 4条评论
关闭

尝试打印“/a/b/job.g”时,文件夹 b 无法打开。#865

pizero 打开了这个问题 2014 年 4 月 1 日 · 4条评论

评论

尝试打印“/a/b/job.g”时,文件夹 b 无法打开。 #865

尝试打印“/a/b/job.g”时,文件夹 b 无法打开。
CardReader::openFile fails if folder depth is greater than 1
错误发生在 cardreader.cpp line 312:
In line

if(!myDir.open(curDir,subdirname,O_READ))

myDir 在第二次通过时已经打开 – 因为它用于打开第一个文件夹 a – 因此无法为第二个文件夹 b 重新打开。要解决此问题,必须关闭 myDir。但是,这也会关闭 curDir,它需要作为下一个要打开的文件夹的父级。所采取的方法被打破了。
要解决此问题,可以使用使用两个 SdFile 并在它们之间切换的模式,就像在 SdFile::open 中所做的那样。

尝试打印“/a/b/job.g”时,文件夹 b 无法打开。 #865
作者

我从第 292 行开始对 CardReader::openFile 进行了如下更改

  SdFile dir1,dir2; SdFile* tmpDir=&dir1;
  curDir=&root;
  char *fname=name;

  char *dirname_start,*dirname_end;
  if(name[0]=='/')
  {
    dirname_start=strchr(name,'/')+1;
    while(dirname_start>0)
    {
      dirname_end=strchr(dirname_start,'/');
      //SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start-name));
      //SERIAL_ECHO("end  :");SERIAL_ECHOLN((int)(dirname_end-name));
      if(dirname_end>0 && dirname_end>dirname_start)
      {
        char subdirname[13];
        strncpy(subdirname, dirname_start, dirname_end-dirname_start);
        subdirname[dirname_end-dirname_start]=0;
        if(tmpDir->isOpen()) tmpDir->close();
        if(tmpDir->open(curDir,subdirname,O_READ))
        {
          curDir=tmpDir;
          tmpDir=tmpDir==&dir1?&dir2:&dir1;
          dirname_start=dirname_end+1;
        }
        else
        {
          SERIAL_PROTOCOLPGM(MSG_SD_OPEN_FILE_FAIL);
          SERIAL_PROTOCOL(subdirname);
          SERIAL_PROTOCOLLNPGM("");
          return;
        }
      }
      else // the reminder after all /fsa/fdsa/ is the filename
      {
        fname=dirname_start;
        //SERIAL_ECHOLN("remainder");
        //SERIAL_ECHOLN(fname);
        break;
      }

    }
  }
  else //relative path
  {
    curDir=&workDir;
  }

似乎对我有用。