【C++】随机重命名MP3文件

新置MP3一件,竟然没有随机播放的功能。坑啊!身为程序媛一枚,自己动手吧~

获取当前路径:

char buf[1000];
	GetCurrentDirectory(1000,buf);
	string cur_folder_file = string(buf)+"\\*.mp3";

获取当前路径mp3文件列表:

void getMp3Names(string filepath,vector<string> &names)
{
	names.clear();
	WIN32_FIND_DATA f;
	HANDLE h = FindFirstFile(filepath.c_str() , &f);
	if(h != INVALID_HANDLE_VALUE)
	{
		do
		{
			names.push_back(f.cFileName);
		} while(FindNextFile(h, &f));
	}
	FindClose(h);
}

随机重命名mp3文件(命名为num.mp3,如5.mp3):

void renameMp3Names(vector<string> &names){
	int mp3_num = names.size();
	vector<bool> used_names(mp3_num,false);
	srand(time(NULL));
	for(int i=0;i<mp3_num;i++){
		int new_name_num = -1;
		while(new_name_num<0){
			int tmp= rand()%mp3_num;
			if(!used_names[tmp]){
				new_name_num = tmp;
				used_names[tmp] = true;
			}
		}
		char char_tmp[100];
		itoa(new_name_num,char_tmp,10);
		string new_name = string(char_tmp)+".mp3";
		if(!_access(names[i].c_str(),0))
		{
			if(!rename(names[i].c_str(),new_name.c_str()))
			{
				cout<<"RENAME "<<names[i]<<" AS: "<<new_name<<""<<endl;
			}
		}
	}
	return ;
}

基本能够啦~

只是有一点。这个程序执行第二遍就有问题了,由于全部的文件都变成了 num.mp3,再次随机重命名的时候就会出现冲突,重名文件存在导致rename()失败!

再小小改动一下:

void renameMp3Names(vector<string> &names){
	cout<<"---------------RENAME MP3 FILES---------------"<<endl;
	int mp3_num = names.size();
	vector<bool> used_names(mp3_num,false);
	srand(time(NULL));
	for(int i=0;i<mp3_num;i++){
		int new_name_num = -1;
		while(new_name_num<0){
			int tmp= rand()%mp3_num;
			if(!used_names[tmp]){
				new_name_num = tmp;
				used_names[tmp] = true;
			}
		}
		char char_tmp[100];
		itoa(new_name_num,char_tmp,10);
		string new_name = string("tmp")+string(char_tmp)+".mp3";
		if(!_access(names[i].c_str(),0))
		{
			if(!rename(names[i].c_str(),new_name.c_str()))
			{
				cout<<"RENAME "<<names[i]<<" AS: "<<new_name<<""<<endl;
				names[i] = new_name;
				//used_names[i] =false;
			}
		}
	}
	for(int i=0;i<mp3_num;i++)
		used_names[i] = false;
	cout<<endl;
	cout<<"-------------AGAIN RENAME MP3 FILES-------------"<<endl;
	for(int i=0;i<mp3_num;i++){
		int new_name_num = -1;
		while(new_name_num<0){
			int tmp= rand()%mp3_num;
			if(!used_names[tmp]){
				new_name_num = tmp;
				used_names[tmp] = true;
			}
		}
		char char_tmp[100];
		itoa(new_name_num,char_tmp,10);
		string new_name = string(char_tmp)+".mp3";
		if(!_access(names[i].c_str(),0))
		{
			if(!rename(names[i].c_str(),new_name.c_str()))
			{
				cout<<"RENAME "<<names[i]<<" AS: "<<new_name<<""<<endl;
			}
		}
	}
	cout<<endl;
	return ;
}

大功告成啦。

*有关生成随机序列的改动

多谢一楼友邻xiucaijiang?的留言。指出来上述方法生成随机序列的效率非常低。确实。上面用的方法是初始化一个序列用来记录已经“用过”的数,如果生成的随机数是已经用过的数。那么就再又一次生成一遍。

这样的方法对于生成大小为N的随机序列,生成第一个随机数的期望次数为1次,第二次为N/(N-1)次,第三次为N/(N-2)次,最后一个数期望次数为N次效率确实非常低。

xiucaijiang?给出的方法非常好:

能够这样理解这样的方法:生成随机序列相当于把之前0~N-1排序的N个数随机排列。那么每次我们随机抽出一个来排到后面。也就是第一次在全部N个数里随机抽一个排到最后一位。第二次在前N-1个数里随机抽一个排到倒数第二位,依次类推。

由于每次排序每一个数被抽到的概率都是1/N。所以能够觉得终于的序列是随机排的。

只是这样的方法在实现起来须要做几次不必要的位移。比方上面的样例中,第二次如果抽到了2,由0,1,2,3,5,4变成0,1,3,5,2,4须要把3移到第2位,5移到第三位,2换到第四位。这里3和5的移位事实上是不必要的。也就是我们下一次在4个数里随机取,前4个数排列成0,1,3,5还是0,1,5,3是不影响的。

所以仅仅须要把2和5换位置就可以。

总结生成随机序列的方法:循环N次。第i(i=0~N-1)次的操作为在前N-i个数中随机选一个数与第N-i-1个数交换位置。

void generateRandomList(vector<int> & rand_list){
	int rand_size = rand_list.size();
	for(int i=0;i<rand_size;i++){
		rand_list[i] = i;
	}
	srand(time(NULL));
	for(int i=0;i<rand_size;i++){
		int tmp_rand= rand()%(rand_size-i);
		int tmp = rand_list[tmp_rand];
		rand_list[tmp_rand] = rand_list[rand_size-1-i];
		rand_list[rand_size-1-i] = tmp;
	}
	return;
}

这次仅仅须要随机N次就能够生成不反复的随机序列啦~

(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu?未经同意请勿用于商业用途)

原文地址:https://www.cnblogs.com/mqxnongmin/p/10579127.html

时间: 2024-11-07 16:53:14

【C++】随机重命名MP3文件的相关文章

提取论文标题并自动重命名pdf文件

在我们确定一个研究课题之后,我们总是会先下载一堆相关的paper,看看这个领域现在已经做到一个什么地步,也看看别人是怎么做的,后面自己写paper的时候可以参考参考.当我们把相关的文章都下载到一个文件夹之后,有一个问题,一般我们从IEEE或是ACM相关站点下载的PDF文件的文件名不是相应文章的标题.我们希望文件名尽量能够反映文件的主要内容,文章的标题显然是最能概括文张内容的.昨天上午,一个小时的时间就花在把下载下来的文件重命名上了.因为太费时间,想自己写个简单的小程序来完成这个工作.上网一找,嗬

Shell随机重命名所有当前目录一级子目录

直接使用Unix/Linux系统uuid文件截取部分生成随机数,同时为了防止重命名过程中有可能已存在和新随机目录同名的一级子目录,即重命名操作失效,mv效果变成了移动旧目录至一级子目录,特意添加了一重循环检测.使用该脚本可以直接修改脚本所在目录的所有同级一级子目录. #!/bin/sh for Dir in $(find -maxdepth 1 -type d | sed '1d') do     NewDir=$(cat /proc/sys/kernel/random/uuid | cksum

Linux中重命名乱码文件

Linux下,如何将一个乱码的文件进行重命名 方法一: 命令格式:mv $(ls |egrep "[^a-zA-Z0-9.-]") tandao.tx [[email protected] o]# ls |egrep "[^a-zA-Z0-9.-]" ?°-?ˉ? ###从找到文件中找出乱码文件 [[email protected] o]# mv $(ls |egrep "[^a-zA-Z0-9.-]") tandao.txt 方法二: 命令格式

Python实现重命名一个文件夹下的图片

在网上查了一下python实现的图片重命名,工作中刚好用一下. 1 # -*- coding:utf8 -*- 2 import os 3 path = '新建文件夹 (2)/' 4 filelist = os.listdir(path) 5 for item in filelist: 6 # print('item name is ',item) 7 if item.endswith('.jpg'): 8 name = item.split('.',1)[0] 9 src = os.path.

使用Python重命名MP3标签

从Window复制MP3文件的到Ubuntu下,MP3标签很多是乱码.于是想自己写个Python程序处理一下. 从酷狗复制过来的音乐文件名都是“作者 - 标题”,所以可以通过解析文件名直接获取作者和标题信息. 需要下载eyeD3模块  $ sudo apt-get install python-eyed3 代码 #/usr/bin/env python # -*- encoding:utf-8 -*- import os import eyeD3 # 遍历目录下的文件 for filename

Python批量重命名指定文件夹下文件的两种方法

#法一 import os path = "C://Python34//" for file in os.listdir(path): if os.path.isfile(os.path.join(path,file))==True: if file.find('.')<0: newname=file+'.jpg' os.rename(os.path.join(path,file),os.path.join(path,newname)) #法二 import os import

PHP 文件夹下文件重命名 把文件排序打散

$dir1 = '/Volumes/UMUSIC/'; $filearr = scandir($dir1); unset($filearr[0]); unset($filearr[1]); // unset($filearr[177]); $filearr = array_values($filearr); // dd($filearr); foreach ($filearr as $v) { if(is_dir($dir1 . $v)){ continue; } if(strpos($v,'.

ruby复制文件夹到新的重命名的文件夹

require 'yaml' require 'find' require 'fileutils' SOURCE_DIR = "/media/zn/工作1/开发/网站主题数据/themes/" TARGET_DIR = "/media/zn/商品1/themes/" site_themes = YAML.load_file("site_themes.yml") site_themes.each do |theme| title = theme[0

java 获取文件名(不包括文件的后缀)和文件重命名

获取文件名(不包括后缀) originalFileName.substring(0, originalFileName.lastIndexOf(".")) 文件重命名 public void renameFile(String file, String toFile) { File toBeRenamed = new File(file); //检查要重命名的文件是否存在,是否是文件 if (!toBeRenamed.exists() || toBeRenamed.isDirector