The Frenchman, in the green points jersey, timed his sprint to perfection to beat Jonas Vangenechten (IAM Cycling) by a length after a chaotic finale.
With attacks aplenty off the front of the bunch, it was not clear until the final kilometre that the race would end in a bunch sprint, but when it did Bouhanni was simply too good for his rivals.
Rohan Dennis (BMC Racing) retained the yellow jersey, meanwhile, remaining level with team-mate Tejay van Garderen atop the GC.
Martijn Keizer (LottoNL-Jumbo) and Tosh van der Sande (Lotto-Soudal) went clear early in the day and were allowed to build up lead of more than seven minutes.
Steve Cummings and his MTN-Qhubeka team-mates put in some huge shifts chasing, bringing that gap right down but the action was only just beginning.
As Keizer distanced van der Sande up the road, attacks started flying off the front of the bunch, with the Lotto-Soudal man joined by a counter-attack of team-mate Tim Wellens, Cyril Gautier (Team Europcar) and Lawson Craddock (Giant-Alpecin).
Still Keizer led, but Wellens bridged the gap before distancing the tiring Keizer as the attacks kept coming from behind.
Vincenzo Nibali (Astana), Wilco Kelderman (LottoNL-Jumbo) and Julian Alaphilippe (Etixx-QuickStep) all tried their luck, prompting a big response from the GC men while the bulk of the sprinters also stayed safe.
Wellens’ lead was cut by Tony Martin (Etixx-QuickStep) who earned a gap alongside the equally powerful Daniel Oss (BMC Racing), while Adam Yates (Orica-GreenEDGE) also tested his legs.
When Wellens was caught it was Yates who brought Martin back, but the attacks were still not done as a messy bunch sprint ensued.
Tony Gallopin (Lotto-Soudal) continued his team’s stream of attacks for the day, but Cofidis and MTN-Qhubeka would not be denied the sprint finish.
Gallopin finally sat up, while Tyler Farrar buried himself to lead Edvald Boasson Hagen out – even boasting a small gap.
Samuel Dumoulin (Ag2r-La Mondiale) led the sprint out, with the Norwegian in pursuit, but Bouhanni burst out from behind Jonas Vangenechten’s wheel.
And the Frenchman, in the green points jersey, could not be matched for speed as he beat his chest to celebrate a second stage win of this year’s race.
Criterium du Dauphine 2015: stage four – result
1) Nacer Bouhanni (FRA) – Cofidis – 5.30.53hrs
2) Jonas Vangenechten (BEL) – IAM Cycling – ST
3) Luka Mezgec (SVN) – Giant-Alpecin
4) Edvald Boasson Hagen (NOR) – MTN-Qhubeka
5) Alexey Tsatevich (RUS) – Katusha
6) Julian Alaphilippe (FRA) – Etixx-QuickStep
7) Samuel Dumoulin (FRA) – Ag2r-La Mondiale
8) Tiesj Benoot (BEL) – Lotto-Soudal
9) Kevin Reza (FRA) – FDJ
10) Nathan Haas (AUS) – Cannondale-Garmin
1) Rohan Dennis (AUS) – BMC Racing – 13.31.31hrs
2) Tejay van Garderen (USA) – BMC Racing – ST
3) Andriy Grivko (UKR) – Astana +4”
4) Vincenzo Nibali (ITA) – Astana – ST
5) Lieuwe Westra (NED) – Astana
6) Michele Scarponi (ITA) – Astana
7) Rein Taaramae (EST) – Astana
8) Gorka Izagirre (ESP) – Movistar +5”
9) Alejandro Valverde (ESP) – Movistar – ST
10) John Gadret (FRA) – Movistar