C# 上载文件后自动重命名文件
我有一个音乐文件夹,如下图所示 和下面的代码来上传音乐C# 上载文件后自动重命名文件,c#,asp.net,asp.net-core,razor,file-upload,C#,Asp.net,Asp.net Core,Razor,File Upload,我有一个音乐文件夹,如下图所示 和下面的代码来上传音乐 private IWebHostEnvironment _environment; public UploadFileModel(IWebHostEnvironment environment) { _environment = environment; } [BindProperty] public IFormFile Upload { get; set; } public async Task OnPostAsync() {
private IWebHostEnvironment _environment;
public UploadFileModel(IWebHostEnvironment environment)
{
_environment = environment;
}
[BindProperty]
public IFormFile Upload { get; set; }
public async Task OnPostAsync()
{
var file = Path.Combine(_environment.ContentRootPath, "wwwroot/music", Upload.FileName);
using (var fileStream = new FileStream(file, FileMode.Create))
{
await Upload.CopyToAsync(fileStream);
}
}
在cshtml中
<form method="post" enctype="multipart/form-data">
<input type="file" asp-for="Upload" accept=".mp3"/>
<input type="submit" />
</form>
我想做的是自动将每个新的mp3文件重命名为
“Track{last_number+1}.mp3”
,以防链中缺少一个文件来代替它 我遵循@johnsteps并编写了以下代码。谢谢你,约翰
private IWebHostEnvironment _environment;
public UploadFileModel(IWebHostEnvironment environment)
{
_environment = environment;
}
[BindProperty]
public IFormFile Upload { get; set; }
public async Task OnPostAsync()
{
var musicFileName = "Track0.mp3";
var musicDirectory = Path.Combine(_environment.ContentRootPath, "wwwroot/music");
var musicDirectoryInfo = new DirectoryInfo(musicDirectory);
var fileNumbers = musicDirectoryInfo.GetFiles()
.Where(x => !String.IsNullOrEmpty(x.Name))
.Select(x => GetFileNumber(x.Name))
.OrderBy(x => x)
.ToList();
if (fileNumbers.Count > 0)
{
var fileNumber = fileNumbers.Last() + 1;
var missingNumber = GetMissingNumber(fileNumbers);
if (missingNumber.HasValue)
{
fileNumber = missingNumber.Value;
}
musicFileName = $"Track{fileNumber}.mp3";
}
var file = Path.Combine(_environment.ContentRootPath, "wwwroot/music", musicFileName);
using (var fileStream = new FileStream(file, FileMode.Create))
{
await Upload.CopyToAsync(fileStream);
}
}
private int GetFileNumber(String musicName)
{
var lastFileNumber = musicName.Replace("Track", "").Replace(".mp3", "");
var fileNumber = Convert.ToInt32(lastFileNumber);
return fileNumber;
}
private static int? GetMissingNumber(List<int> numbers)
{
var missingNumbers = Enumerable.Range(0, numbers.Last()).Except(numbers).ToList();
if (missingNumbers.Count > 0)
return missingNumbers.FirstOrDefault();
return null;
}
私人IWebHostEnvironment\u环境;
公共上传文件模型(IWebHostEnvironment环境)
{
_环境=环境;
}
[BindProperty]
公共文件上载{get;set;}
公共异步任务OnPostAsync()
{
var musicFileName=“Track0.mp3”;
var musicDirectory=Path.Combine(_environment.ContentRootPath,“wwwroot/music”);
var musicDirectoryInfo=新目录信息(musicDirectoryInfo);
var fileNumbers=musicDirectoryInfo.GetFiles()
.Where(x=>!String.IsNullOrEmpty(x.Name))
.Select(x=>GetFileNumber(x.Name))
.OrderBy(x=>x)
.ToList();
如果(fileNumbers.Count>0)
{
var fileNumber=fileNumbers.Last()+1;
var missingNumber=GetMissingNumber(文件号);
if(missingNumber.HasValue)
{
fileNumber=missingNumber.Value;
}
musicFileName=$“曲目{fileNumber}.mp3”;
}
var file=Path.Combine(_environment.ContentRootPath,“wwwroot/music”,musicFileName);
使用(var fileStream=newfilestream(file,FileMode.Create))
{
等待上载。CopyToAsync(文件流);
}
}
private int GetFileNumber(字符串musicName)
{
var lastFileNumber=musicName.Replace(“曲目”),Replace(“mp3”);
var fileNumber=Convert.ToInt32(lastFileNumber);
返回文件号;
}
私有静态int?GetMissingNumber(列表编号)
{
var missingNumbers=Enumerable.Range(0,numbers.Last())。除了(numbers.ToList();
如果(missingNumbers.Count>0)
返回missingNumber.FirstOrDefault();
返回null;
}
OK。请注意,您没有包括一个问题。你被困在哪里了?我不知道怎么做,我什么也找不到。你想让它怎么工作?我的意思是,你打算如何确定最后的号码?通过存在的文件?通过一些数据库值?什么?通过检查文件夹中的文件。所以你需要将问题分为4部分:1)获取当前文件的列表。2) 解析当前文件名以获取其编号。3) 取最大值并将其值增加1。4) 生成新文件名。-1-3可能是一个文件名列表的单循环,后面是4。这正是我想要的,只是它不会替换丢失的曲目以防被删除。谢谢,先生,这正是我想要的。