getFileName static method

String getFileName(
  1. String in_path, {
  2. bool removeEXT = false,
  3. bool useRigthDot = true,
})

获取文件或文件夹名称

  • useRigthDot 判断扩展名时应当取左还是右边的点.

特殊情况

  • in_path 空字符串;返回空字符串 ""
  • in_path = "/" 或 "";返回本身 "/" 或 ""

Implementation

static String getFileName(
  String in_path, {
  bool removeEXT = false, // 是否去掉扩展名
  bool useRigthDot = true,
}) {
  if (in_path.isEmpty) {
    return "";
  }
  int i = in_path.length;
  bool isContinueDot = false;
  // 去除尾部的/或\
  while (i-- > 0) {
    if (in_path[i] != '/' && in_path[i] != r'\') {
      break;
    }
    // 如果移除过尾部的斜杠,说明是文件夹,不需要识别扩展名
    removeEXT = false;
  }
  int nameEndIndex = i + 1;
  // 开始查找名称之前的 / 或 \,以及名称之后的.
  // 记录左右.的位置
  int? leftDotIndex, leftTempDotIndex, rightDotIndex;
  if (nameEndIndex <= 0) {
    return in_path;
  }
  for (; i-- > 0;) {
    if (in_path[i] == '/' || in_path[i] == r'\') {
      // 如果为路径符号
      if (i == in_path.length) {
        return "";
      } else {
        break;
      }
    } else if ('.' == in_path[i]) {
      // .
      if (removeEXT) {
        rightDotIndex ??= i;
        leftTempDotIndex = leftDotIndex;
        leftDotIndex = i;
        isContinueDot = (leftDotIndex != rightDotIndex);
      }
    } else {
      isContinueDot = false;
    }
  }
  // 修正右边界
  rightDotIndex ??= nameEndIndex;
  var start = i + 1;
  int? end;
  if (useRigthDot) {
    end = rightDotIndex;
  } else {
    end = leftDotIndex;
  }
  if (start < 0) {
    start = 0;
  }
  if (null != end && end < 0) {
    end = 0;
  }
  if (leftDotIndex == start) {
    // .开头,整个文件名都是扩展名
    if (isContinueDot ||
        false == removeEXT ||
        leftDotIndex == rightDotIndex) {
      // 连续 .
      // 不删扩展名
      // 只有开头一个点
      end = nameEndIndex;
    } else {
      // 移除扩展名
      if (useRigthDot) {
        end = rightDotIndex;
      } else {
        // 此时[leftDotIndex]是开头的.因此需要取第二个点
        end = leftTempDotIndex;
      }
    }
  }
  return in_path.substring(start, end);
}